标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11846 | Accepted: 4050 |
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
1、无向图存在欧拉回路条件:每个点入度都为偶数
2、无向图存在欧拉路条件:只有两个点入度为奇数或每个点入度都为偶数
3、有向图存在欧拉回路条件:每个点入度都等于出度
4、有向图存在欧拉路条件:只存在这样两个点:一个点入度等于出度+1,另一个点入度=出度-1,其他每个点入度都等于出度,或者每个点入度都等于出度。
判连通,判条件就好了
奇怪的是,dfs就WA,并查集就可以
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e5+5,L=1e3+5; int read(){ char c=getchar();int x=0,f=1; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘; c=getchar();} return x*f; } int T,n,ind[30],outd[30],has[30]; char s[L]; //int vis[30],g[30][30]; //void dfs(int u){//printf("dfs %d\n",u); // vis[u]=1; // for(int v=0;v<=25;v++) // if(!vis[v]) dfs(v); //} int fa[30],root=0; inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} int main(){ T=read(); while(T--){ int flag=1; for(int i=0;i<=25;i++) ind[i]=outd[i]=has[i]=0,fa[i]=i; //memset(g,0,sizeof(g)); n=read(); for(int i=1;i<=n;i++){ scanf("%s",s+1); int len=strlen(s+1),u=s[1]-‘a‘,v=s[len]-‘a‘; //g[u][v]=g[v][u]=1; fa[find(u)]=find(v);root=find(v); outd[u]++;ind[v]++; has[u]=has[v]=1; } //for(int i=0;i<=25;i++) if(has[i]) {dfs(i);break;} //for(int i=0;i<=25;i++) if(has[i]&&!vis[i]) {flag=0;break;} for(int i=0;i<=25;i++) if(has[i]&&find(i)!=root){flag=0;break;} if(flag){ int more=0,less=0; for(int i=0;i<=25;i++){ if(abs(outd[i]-ind[i])>=2) {flag=0;break;} if(outd[i]==ind[i]+1) more++; if(outd[i]==ind[i]-1) less++; } if(flag){ if((more==0&&less==0)||(more==1&&less==1)) printf("Ordering is possible.\n"); else flag=0; } } if(flag==0) printf("The door cannot be opened.\n"); } }
标签:
原文地址:http://www.cnblogs.com/candy99/p/5907657.html