1 条题解
-
0

// 欧拉路径 欧拉回路 O(mlogm) #include<bits/stdc++.h> using namespace std; const int n=500,N=505; int m,du[N]; stack<int> path; struct E{ int to; //终点 int idx; //反边的终点的下标 bool del; //删除标记 }; vector<E> e[N]; //邻接表 int pos[N]; //pos[x]记录点x的下标编号 int p[N]; //p[x]表示点x当前处理到第几条出边,初始值为0,相当于全局指针 void dfs(int x){ for(int i=p[x]; i<e[x].size(); i=p[x]){ p[x]=i+1; //全局指针,指向下一条边 E &a=e[x][i]; if(!a.del){ a.del=e[a.to][a.idx].del=true; //打删除标记 dfs(a.to); } } path.push(x); //后序记录路径 } int main(){ scanf("%d",&m); for(int i=1,a,b; i<=m; ++i){ scanf("%d %d",&a,&b); e[a].push_back({b,0,0}); e[b].push_back({a,0,0}); ++du[a]; ++du[b]; } for(int i=1; i<=n; ++i)if(!e[i].empty()) sort(e[i].begin(),e[i].end(),[&](E a,E b){return a.to<b.to;}); //点i的邻接点升序 for(int i=1; i<=n; ++i)for(int j=0; j<e[i].size(); ++j) e[i][j].idx=pos[e[i][j].to]++; //记录e[i][j]的反边的终点的下标 int start=1; while(!du[start]) start++; //排除度数为0的点 for(int i=1; i<=n; i++)if(du[i]&1){ //查找度数为奇数的点 start=i; break; } dfs(start); while(!path.empty())printf("%d\n",path.top()),path.pop(); }
- 1
信息
- ID
- 1034
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 146
- 已通过
- 29
- 上传者