首页 > 其他 > 详细

UVA10054 The Necklace

时间:2015-10-27 19:13:20      阅读:252      评论:0      收藏:0      [点我收藏+]

UVA10054 The Necklace

 

链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18806

 

【思路】

  欧拉回路。

  把每一种颜色看作结点,每一个珠子看作边,构图后求欧拉回路即用所有的珠子构成一条项链。

  需要注意的是ans的加入是逆序的,G记录的是边出现的次数。

【代码】

 

 1 #include<cstdio>
 2 #include<queue>
 3 #include<vector>
 4 #include<cstring>
 5 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
 6 using namespace std;
 7 
 8 const int maxn = 50+10;
 9 const int N=50;
10 struct Node{
11     int u,v;
12 };
13 int n,m;
14 int deg[maxn],G[maxn][maxn];
15 
16 vector<Node> ans;
17 void euler(int u) {
18     FOR(v,1,N) if(G[u][v]) {
19               G[u][v]--; G[v][u]--;
20               euler(v);
21               ans.push_back((Node){u,v});
22        }
23 }
24 
25 int main() {
26     int T,kase=0;
27     scanf("%d",&T);
28     while(T--)
29     {
30         memset(deg,0,sizeof(deg));
31         memset(G,0,sizeof(G));
32         scanf("%d",&n);
33         int u,v,start=-1;
34         FOR(i,1,n) {
35             scanf("%d%d",&u,&v);
36             G[u][v]++; G[v][u]++;
37             deg[u]++; deg[v]++;
38             start=u;
39         }
40         bool solved=true;
41         FOR(i,1,N)  if(deg[i]&1) { solved=false; break; }
42         if(solved) {
43             ans.clear();
44             euler(start);
45             if(ans.size()!=n || ans[0].v!=ans[ans.size()-1].u) solved=false;  //注意ans是逆序 
46         }
47         printf("Case #%d\n",++kase);
48         if(!solved) printf("some beads may be lost\n");
49         else
50            for(int i=ans.size()-1;i>=0;i--) printf("%d %d\n",ans[i].u,ans[i].v);
51         if(T) putchar(\n);
52     }
53     return 0;
54 }

 

UVA10054 The Necklace

原文:http://www.cnblogs.com/lidaxin/p/4915005.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!