Undraw the Trees UVA - 10562 DFS实现

思路:判欧拉回路  一个是对应无向图连通 用DFS  继续判 入度   不等于出度的点 不符合2个以内 2个其中一个入度大于出度1,另一个出度大于入度1 

#include<bits/stdc++.h>
using namespace std;
char s[1005];
int vis[26];
int mp[27][27];
int indgree[26],outdgree[26];
void dfs(int x){
    vis[x]=1;
for(int i=0;i<26;i++)
if(mp[x][i]&&vis[i]!=1){
    dfs(i);
}

}

int main(){
int t;
cin>>t;
while(t--){
        bool ok=1;
        memset(mp,0,sizeof(mp));
        memset(vis,0,sizeof(vis));
        memset(indgree,0,sizeof(indgree));
        memset(outdgree,0,sizeof(outdgree));
    int n;
    cin>>n;
    int c;                    //用来DFS

    for(int i=0;i<n;i++){
        cin>>s;
       int  temp=strlen(s);
        c=s[0]-'a';
        vis[s[0]-'a']=vis[s[temp-1]-'a']=-1;

        outdgree[s[0]-'a']++;
         indgree[s[temp-1]-'a']++;
        mp[s[0]-'a'][s[temp-1]-'a']++;
        mp[s[temp-1]-'a'][s[0]-'a']++;  //底图连通
    }
   dfs(c);
   for(int i=0;i<26;i++){
    if(vis[i]==-1)ok=0;
   }
if(!ok){cout<<"The door cannot be opened.\n";continue;}
int cnt1=0,cnt2=0;
for(int i=0;i<26;i++){
        if(!ok)break;
    indgree[i]-=outdgree[i];
    if(indgree[i]!=0){
        if(indgree[i]==1){
            cnt1++;
        }
        else if(indgree[i]==-1){
            cnt2++;
        }
        else ok=0;
    }
    if(cnt1>1||cnt2>1){
        ok=0;
        break;
    }
}


if(ok)cout<<"Ordering is possible."<<endl;
        else cout<<"The door cannot be opened."<<endl;

}
return 0;
}

猜你喜欢

转载自blog.csdn.net/bug___maker/article/details/81054707