1 // 欧拉图 CCF2016第六次 送货 2 // 思路: 3 // CCF数据很水。。。。这道题有问题 4 // 先判连通,再dfs边。 5 // 应为输出要满足字典序最小,用vector存图,sort一遍,用stack保存答案 6 7 #include <bits/stdc++.h> 8 using namespace std; 9 #define LL long long 10 typedef pair<int,int> pii; 11 const double inf = 123456789012345.0; 12 const LL MOD =100000000LL; 13 const int N =1e4+10; 14 #define clc(a,b) memset(a,b,sizeof(a)) 15 const double eps = 1e-7; 16 void fre() {freopen("in.txt","r",stdin);} 17 void freout() {freopen("out.txt","w",stdout);} 18 inline int read() {int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1; ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();}return x*f;} 19 20 vector<int> g[N]; 21 bool vit[N][N]; 22 bool vis[N]; 23 int d[N]; 24 void dfs(int x){ 25 vis[x]=true; 26 for(int i=0;i<(int)g[x].size();i++){ 27 int v=g[x][i]; 28 if(!vis[v]) 29 dfs(v); 30 } 31 } 32 stack<int> st; 33 void euler(int x){ 34 for(int i=0;i<(int)g[x].size();i++){ 35 int v=g[x][i]; 36 if(!vit[x][v]){ 37 vit[x][v]=vit[v][x]=true; 38 euler(v); 39 st.push(v); 40 } 41 } 42 } 43 int main(){ 44 int n,m; 45 scanf("%d%d",&n,&m); 46 for(int i=1;i<=m;i++){ 47 int x,y; 48 scanf("%d%d",&x,&y); 49 g[x].push_back(y); 50 g[y].push_back(x); 51 d[x]++;d[y]++; 52 } 53 dfs(1); 54 bool flag=true; 55 for(int i=1;i<=n;i++){ 56 if(!vis[i]){ 57 flag=false; 58 break; 59 } 60 } 61 if(!flag){ 62 printf("-1\n"); 63 } 64 else{ 65 int count=0; 66 for(int i=1;i<=n;i++){ 67 sort(g[i].begin(),g[i].end()); 68 if(d[i]%2) count++; 69 } 70 if(count>2) printf("-1\n"); 71 else{ 72 printf("1"); 73 euler(1); 74 while(!st.empty()){ 75 int a=st.top(); 76 st.pop(); 77 printf(" %d",a); 78 } 79 printf("\n"); 80 } 81 } 82 return 0; 83 }
时间: 2024-11-02 16:03:03