UVa 10054 The Necklace【欧拉回路】

题意:给出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)