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 }