有向图的欧拉道路 UVA

来源:互联网 发布:苹果六怎么备份数据 编辑:程序博客网 时间:2024/03/29 02:26
//有向图的欧拉道路#include<iostream>#include<cstdio>#include<cstring> using namespace std;const int maxn=30;int vis[maxn],f[maxn],in[maxn],out[maxn];//vis为有向图的节点,f为并查集,in入度,out节点出度void init(){    memset(vis,0,sizeof(vis));    memset(in,0,sizeof(in));    memset(out,0,sizeof(out));    for(int i=0;i<=26;i++)        f[i]=i;}int F(int x){//并查集     return f[x]==x?x:f[x]=F(f[x]);}void unit(int a,int b){     int x1=F(a),y1=F(b);    if(x1!=y1)f[x1]=y1;}int main(){    int T,N;    cin>>T;    while(T--){        init();        cin>>N;        string s;        while(N--){            cin>>s;            int a=s[0]-'a',b=s[s.size()-1]-'a';            out[a]++,in[b]++;//a的出度加一,b的入度加一            vis[a]=1,vis[b]=1;//ab为点             unit(a,b);//ab为一个类         }        int cnt=0;         for(int i=0;i<=26;i++)            if(vis[i]&&F(i)==i)                cnt++;//类个数        if(cnt>1){//类个数大于一不行             cout<<"The door cannot be opened."<<endl;            continue;        }        int mk1=0,mk2=0,jud=1;        for(int i=0;i<=26;i++){//有向图的欧拉路必须一个点入度比出度大一,另一个相反             if(vis[i]&&in[i]!=out[i]){                if(in[i]+1==out[i]&&!mk1)mk1=1;                else if(in[i]==out[i]+1&&!mk2)mk2=1;                else jud=0;            }        }        if(jud)cout<<"Ordering is possible."<<endl;        else cout<<"The door cannot be opened."<<endl;     }       return 0;} 
0 0
原创粉丝点击