码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10054 The Necklace【欧拉回路】

时间:2015-03-16 14:23:09      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出n个珠子,珠子颜色分为两半,分别用1到50之间的数字表示,

现在给出n个珠子分别的颜色,问是否能够串成一个环。即为首尾相连,成为一个回路

 

判断是否构成一个环,即判断是否为欧拉回路,只需要判断度数是不是偶数就可以了

(这道题目给出的珠子是在一个连通块上的,所以不用考虑连通)

然后输出结果要逆序输出,见这一篇,非常的详细 http://www.cnblogs.com/scau20110726/archive/2012/11/09/2762371.html

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<queue> 
 9 #include<algorithm>  
10 #define mod=1e9+7;
11 using namespace std;
12 
13 typedef long long LL;
14 const int maxn =1005;
15 int g[maxn][maxn],d[maxn];
16 
17 void euler(int u){
18     for(int v=1;v<=50;v++){
19         if(g[u][v]){
20         g[u][v]--;
21         g[v][u]--;
22         euler(v);
23         printf("%d %d\n",v,u);
24         }
25     }
26 }
27 
28 int main(){
29     int n,i,j,t,u,v,flag,kase;
30     scanf("%d",&t);
31     for(kase=1;kase<=t;kase++){
32         memset(g,0,sizeof(g));
33         memset(d,0,sizeof(d));
34         
35         scanf("%d",&n);
36         for(i=1;i<=n;i++){
37             scanf("%d %d",&u,&v);
38             g[u][v]++;//这里是可以输入有重边的,所以重边对应的点的度数也要相应加1,记得杭电有一题要判重 
39             g[v][u]++;
40             d[v]++;
41             d[u]++;
42         }
43         for(i=1;i<=50;i++){
44             if(d[i]%2) break;        
45         }
46         
47         if(kase>1) printf("\n");
48         printf("Case #%d\n", kase);
49         
50         if(i<=50) printf("some beads may be lost\n");
51         else{
52             for(i=1;i<=50;i++){
53                 euler(i);
54             }
55         }  
56     }
57     return 0;    
58 }
View Code

 

UVa 10054 The Necklace【欧拉回路】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4341568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!