CCF第四题无向图打印路径 欧拉问题
#include<iostream> #include<vector> #include<algorithm> #include<stack> #define N 10010 using namespace std; vector<long int> head[N]; stack<long int> way; long int n; bool visited[N][N]; bool vis[N]; long long int d[N]; void addEdge(long int x,long int y) { head[x].push_back(y); head[y].push_back(x); d[x]++; d[y]++; } void dfs(int u) { vis[u]=1; vector<long int>::iterator pos; for(pos=head[u].begin(); pos!=head[u].end(); pos++) { long int v=*pos; if(!vis[v]) { dfs(v); } } } void euler(long int u) { vector<long int>::iterator pos; //利用dfs的方法遍历所有的边 for(pos=head[u].begin(); pos!=head[u].end(); pos++) { long int v=*pos; if(!visited[u][v]) { visited[u][v]=visited[v][u]=1; //我这里不用栈,而是在进行下一个点之前就把当前点输出,样例是过了,可是交上去只能得10分 //cout<<' '<<v; euler(v); //用栈的话就没问题,可以得90分。 way.push(v); } } } int main() { long long int m; cin>>n>>m ; while(m--) { long int x,y; cin>>x>>y; addEdge(x,y); } //以前总是得90分的原因就是没有考虑图不连通的情况 //这里从第一个点出发dfs所有的点,最后检验即可 dfs(1); bool flag=0; for(int i=1; i<=n; i++) if(vis[i]==0) { flag=1; break; } //如果是不连通的,直接输出-1 if(flag==1) cout<<-1; else { long long int odd_num=0; for(long int i=1; i<=n; i++) { sort(head[i].begin(),head[i].end()); if(d[i]%2) odd_num++; } if(odd_num>2) cout<<-1; else { cout<<1; euler(1); while(!way.empty()) { cout<<' '<<way.top(); way.pop(); } } } return 0; }