题意:一串节点项链,每一个节点两头有颜色,后一个节点都头颜色一定要和前一个节点的尾颜色相等,给你n个节点,问你是否能组成项链。。如果能,输出序列
解题思路:典型的欧拉回路判断,关键是输出,没有递归输出错了,递归输出却对了 我觉得应该是uva special juage的问题吧。。
解题代码:
// File Name: uva10596.c // Author: darkdream // Created Time: 2013年06月15日 星期六 20时44分39秒 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #include<math.h> int map[204][204]; int kk[204]; int visit[204]; void dfs(int k ) { for(int i = 0 ;i <= 55;i ++) { if(map[k][i] != 0 && visit[i] == 0) { visit[i] = 1; dfs(i); } } } void dfs1(int k ) { //printf("%d ",k); for(int i = 0;i <= 55 ;i ++) { if(map[k][i] != 0) { // printf("%d %d ",k,i); 为什么不能放在这里 map[k][i]--; map[i][k]--; dfs1(i); printf("%d %d ",i,k); //为什么一定要放在这里。。。 } } } int main(){ //freopen("/home/plac/problem/input.txt","r",stdin); //freopen("/home/plac/problem/output.txt","w",stdout); int t , m; scanf("%d",&t); for(int CASE = 1; CASE <= t; CASE ++) { int a, b; scanf("%d",&m); int ok = 1; memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); memset(kk,0,sizeof(kk)); while(m--) { scanf("%d %d",&a,&b); map[a][b]++ ; map[b][a]++; kk[a] ++; kk[b] ++; } for(int i = 0 ;i <= 55;i ++ ) { if(kk[i] %2 == 1) ok = 0; } if(ok) { visit[a] = 1; dfs(a); for(int i = 0 ; i <= 55;i ++) if( kk[i] != 0 && visit[i] == 0 ) ok = 0 ; } if(CASE != 1 ) printf(" "); printf("Case #%d ",CASE); if( ok == 1) { dfs1(a); } else printf("some beads may be lost "); } return 0 ; }