题意:给出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 }
时间: 2024-11-03 22:13:04