Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 8571 | Accepted: 2997 |
Description
Input
Output
Sample Input
3 2 acm ibm 3 acm malform mouse 2 ok ok
Sample Output
The door cannot be opened. Ordering is possible. The door cannot be opened.
题意:给出n个单词,问所有的单词能否首尾相连(能相连的单词的首和尾必须是相同的);
思路:一道判断有向图欧拉路的题目;
可以将每个单词的首和尾看作节点,判断图的连通性可以用并查集,每输入一个单词将其首和尾加入集合中,最后任取一个节点判断其他所有节点和该节点是否有共同的祖先,若是,则是连通的,否则不连通;
在连通性的前提下,若所有节点的入读等于出度 或者 一个节点的入度比出度大1 一个节点的入度比出度小1,说明有欧拉路,否则没有欧拉路;
因为手误,贡献一次WA;
1 #include<stdio.h> 2 #include<string.h> 3 4 int set[30],indegree[1010],outdegree[1010],vis[26]; 5 int count; 6 7 void init() 8 { 9 for(int i = 0; i < 26; i++) 10 set[i] = i; 11 } 12 13 int find(int x) 14 { 15 if(set[x] != x) 16 set[x] = find(set[x]); 17 return set[x]; 18 } 19 20 int check() 21 { 22 int x,i; 23 int flag = 0; 24 for(i = 0; i < 26; i++) 25 { 26 if(vis[i]) 27 { 28 if(flag == 0) 29 { 30 x = find(i); 31 flag = 1; 32 } 33 else 34 { 35 if(find(i) != x) 36 break; 37 } 38 } 39 } 40 if(i < 26) 41 return 0;//图是不连通的,直接返回; 42 43 int c1 = 0, c2 = 0, c3 = 0; 44 for(int i = 0; i < 26; i++) 45 { 46 if(vis[i]) 47 { 48 if(indegree[i] == outdegree[i]) 49 c1++; 50 else if(indegree[i]-outdegree[i] == 1) 51 c2++; 52 else if(outdegree[i]-indegree[i] == 1) 53 c3++; 54 } 55 } 56 if((c2 == 1 && c3 == 1 && c1 == count-2) ||(c1 == count)) 57 return 1; 58 else return 0; 59 } 60 61 int main() 62 { 63 int test,n; 64 char s[1010]; 65 scanf("%d",&test); 66 while(test--) 67 { 68 memset(indegree,0,sizeof(indegree)); 69 memset(outdegree,0,sizeof(outdegree)); 70 memset(vis,0,sizeof(vis)); 71 init(); 72 count = 0; 73 74 scanf("%d",&n); 75 for(int i = 1; i <= n; i++) 76 { 77 scanf("%s",s); 78 int len = strlen(s); 79 int u = s[0]-'a'; 80 if(!vis[u]) 81 { 82 vis[u] = 1; 83 count++; 84 } 85 int v = s[len-1]-'a'; 86 if(!vis[v]) 87 { 88 vis[v] = 1; 89 count++; 90 } 91 92 indegree[u]++; 93 outdegree[v]++; 94 int tu = find(u); 95 int tv = find(v); 96 if(tu != tv) 97 set[tu] = tv; 98 } 99 100 if(check()) 101 printf("Ordering is possible.\n"); 102 else printf("The door cannot be opened.\n"); 103 } 104 return 0; 105 }
欧拉路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,
称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
判断欧拉路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
其中判断图的连通性用并查集。