HDU1116 Play on Words(有向图欧拉通路)

我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路。。

这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了。

有向图包含欧拉通路的充要条件是:首先基图连通,然后是所有点的入度=出度 或者 有且只有一点出度=入度+1(起点)且有且只有一点入度=出度+1(终点)

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 int par[26];
 6 int Find(int a){
 7     while(par[a]!=a){
 8         par[a]=par[par[a]];
 9         a=par[a];
10     }
11     return a;
12 }
13 void Union(int a,int b){
14     int pa=Find(a),pb=Find(b);
15     if(pa==pb) return;
16     par[pa]=pb;
17 }
18 
19 int main(){
20     int t,n;
21     char s[1111];
22     scanf("%d",&t);
23     while(t--){
24         int deg[26]={0};
25         bool vis[26]={0};
26         for(int i=0; i<26; ++i) par[i]=i;
27 
28         scanf("%d",&n);
29         for(int i=0; i<n; ++i){
30             scanf("%s",s);
31             ++deg[s[0]-'a']; --deg[s[strlen(s)-1]-'a'];
32             vis[s[0]-'a']=vis[s[strlen(s)-1]-'a']=1;
33             Union(s[0]-'a',s[strlen(s)-1]-'a');
34         }
35 
36         int cnt0=0,cnt1=0,cnt2=0,cnt3=0;
37         for(int i=0; i<26; ++i){
38             if(vis[i] && par[i]==i) ++cnt0;
39             if(deg[i]==-1) ++cnt1;
40             else if(deg[i]==1) ++cnt2;
41             else if(deg[i]!=0) ++cnt3; 
42         }
43         if(cnt0>1 || cnt3!=0 || !(cnt1==1&&cnt2==1 || cnt1==0&&cnt2==0)) puts("The door cannot be opened.");
44         else puts("Ordering is possible.");
45     }
46     return 0;
47 } 
原文地址:https://www.cnblogs.com/WABoss/p/4990573.html