UVa 10054 The Necklace BFS+建模欧拉回路
算法指南
主要就是建立欧拉回路
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <math.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #include <memory.h> 14 using namespace std; 15 const int maxn=50; 16 int G[maxn+10][maxn+50]; 17 int deg[maxn+50]; 18 struct edge { 19 int u,v; 20 edge(int u,int v):u(u),v(v) {} 21 }; 22 vector<edge>ans; 23 void slove(int u) { 24 for(int v=1; v<=maxn; v++) { 25 if(G[u][v]) { 26 G[u][v]--; 27 G[v][u]--; 28 slove(v); 29 ans.push_back(edge(u,v)); 30 } 31 } 32 } 33 34 int main() { 35 int t,cas=0,n; 36 scanf("%d",&t); 37 int N=t; 38 while(t--) { 39 memset(G,0,sizeof(G)); 40 memset(deg,0,sizeof(deg)); 41 cas++; 42 scanf("%d",&n); 43 int start; 44 for(int i=0; i<n; i++) { 45 int u,v; 46 scanf("%d%d",&u,&v); 47 G[u][v]++; 48 G[v][u]++; 49 deg[u]++; 50 deg[v]++; 51 start=u; 52 } 53 int flag=true; 54 for(int i=1; i<=maxn; i++) { 55 if(deg[i]%2) { 56 flag=false; 57 break; 58 } 59 } 60 if(flag) { 61 ans.clear(); 62 slove(start); 63 if(ans.size()!=n||ans[0].v!=ans[ans.size()-1].u) flag=false; 64 } 65 printf("Case #%d\n", cas); 66 if(flag==false) { 67 printf("some beads may be lost\n"); 68 } else { 69 for(int i=ans.size()-1; i>=0; i--) { 70 printf("%d %d\n",ans[i].u,ans[i].v); 71 } 72 } 73 if(cas!=N) 74 printf("\n"); 75 } 76 return 0; 77 }