UVa10129(欧拉回路,并查集)

来源:互联网 发布:漫画算法 编辑:程序博客网 时间:2024/06/05 02:23

//思路:把单词的第一个字母和最后一个字母当成结点,单词的第一个字母连向最后一个字母看成有向边。

每个结点记录度数(出度与入度之和,可以把出度+1,入度-1),用并查集判断图的连通性(可以用cc=26记录,最后统计是不是1)


AC源码:

#include <cstring>#include <iostream>#include <vector>using namespace std;const int MAXN=256;int deg[MAXN],used[MAXN];int p[MAXN],cc=26;int findset(int x){return p[x]==x?x:p[x]=findset(p[x]);}int main(){int T,n;string s;cin>>T;while(T--){cc=26;memset(deg,0,sizeof(deg));memset(used,0,sizeof(used));for(int i='a';i<='z';++i)p[i]=i;cin>>n;while(n--){cin>>s;++deg[s[0]];--deg[s[s.length()-1]];used[s[0]]=used[s[s.length()-1]]=1;int x=findset(s[0]),y=findset(s[s.length()-1]);if(x!=y){p[x]=y;--cc;}}vector<int> d;for(int i='a';i<='z';++i){if(deg[i])d.push_back(deg[i]);if(!used[i])--cc;}bool ok=false;if(cc==1&&(d.size()==0||(d.size()==2&&(d[0]==1||d[0]==-1))))ok=true;if(ok)cout<<"Ordering is possible.\n";elsecout<<"The door cannot be opened.\n";}return 0;}


原创粉丝点击