CCF 201512-4
方法
使用DFS方法寻找欧拉路径。
算法步骤
1、首先判断是否存在欧拉路径(网上找找)
2、注意题目要求的起点一定是从1开始的。
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
using namespace std;
bool vis[10010][10010]={false};
int D[10010]={0};
struct Node{
bool flag=false;
int num,l;
set<int> next;
set<int>::iterator it=next.begin();
}node[10010];
int beg=1<<30;
queue<int> front;
stack<int> back;
void DFS(int num){
node[num].flag=true;
// cout << *node[num].it;
for(;node[num].it!=node[num].next.end();node[num].it++){
int k=*node[num].it;
if(!vis[num][k]){
vis[num][k]=true;
vis[k][num]=true;
DFS(*node[num].it);
}
}
back.push(num);
}
int main(){
int n,m;
cin >> n >> m;
for(int i=0;i<m;i++){
int x,y;
cin >> x >> y;
D[x]++;D[y]++;
node[x].next.insert(y);
node[y].next.insert(x);
}
int term=0;
for(int i=1;i<=n;i++){
node[i].l=node[i].next.size();
node[i].it=node[i].next.begin();
if(D[i]%2!=0){
if(i<beg) beg=i;
term++;
}
}
if(term!=2 && term!=0 || (term==2 && beg!=1)){
cout <<-1;
return 0;
}
if(term==0) beg=1;
DFS(1);
for(int i=1;i<=n;i++){
if(!node[i].flag){
cout << -1;
return 0;
}
}
while(!back.empty()){
cout << back.top() << ' ';
back.pop();
}
return 0;
}