标签:
Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
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.
Source
欧拉道路问题。这题欧拉回路或者欧拉道路都算成立。
建好图以后先判一下连通性,如果图不连通,肯定不成立。
↑DFS BFS 并查集都可以
然后是判欧拉路径。
如果是欧拉回路,那么所有点的入度等于出度。
如果是欧拉路径,那么只有两个点的入度不等于出度,其一是起始点,出度比入度大1,另一个是结束点,入度比出度大1
之前一直WA,不知怎么改着改着就对了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 const int mxn=1000; 8 bool vis[mxn]; 9 int n; 10 int fa[mxn]; 11 int in[mxn],out[mxn]; 12 void init(int n){ 13 for(int i=1;i<=n;i++)fa[i]=i; 14 } 15 int find(int x){ 16 if(fa[x]==x)return x; 17 else return fa[x]=find(fa[x]); 18 } 19 char s[1100]; 20 int main(){ 21 int T; 22 scanf("%d",&T); 23 while(T--){ 24 memset(vis,0,sizeof vis); 25 memset(in,0,sizeof in); 26 memset(out,0,sizeof out); 27 scanf("%d",&n); 28 init(28); 29 int i,j; 30 for(i=1;i<=n;i++){ 31 scanf("%s",s); 32 int u=s[0]-‘a‘+1; 33 int v=s[strlen(s)-1]-‘a‘+1; 34 in[v]++;out[u]++; 35 vis[u]=vis[v]=1; 36 int x=find(u),y=find(v); 37 if(x!=y)fa[y]=x; 38 } 39 int st=0,ed=0;bool flag=0; 40 int cnt=0; 41 for(i=1;i<=26;i++){ 42 if(vis[i] && find(i)==i){ 43 cnt++; 44 } 45 if(out[i]!=in[i]){//出度不等于入度时判定 46 if(out[i]==in[i]+1){ 47 if(!st)st=i; 48 else flag=1; 49 } 50 else if(in[i]==out[i]+1){ 51 if(!ed)ed=i; 52 else flag=1; 53 } 54 else flag=1; 55 } 56 } 57 if(cnt!=1){//非连通特判 58 printf("The door cannot be opened.\n"); 59 continue; 60 } 61 if(flag==1)printf("The door cannot be opened.\n"); 62 else printf("Ordering is possible.\n"); 63 } 64 return 0; 65 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5665135.html