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 }
View Code

 

posted @ 2016-03-23 22:28  yyblues  阅读(202)  评论(0编辑  收藏  举报