首页 > 代码库 > poj 1386 Play on Words 有向图欧拉路径判断
poj 1386 Play on Words 有向图欧拉路径判断
题意:
给n个单词,问是否可以将他们排成一排,使得前一个单词的末字符和后一个单词的首字符相同。
分析:
把每个单词看成一条边,转化为有向图是否存在欧拉路径问题。
代码:
//poj 1386 //sep9 #include <iostream> #include <vector> #include <algorithm> #include <map> #include <string> using namespace std; const int maxN=30; int f[maxN]; int in[maxN],out[maxN]; char name[1024]; int find(int u) { return f[u]==u?u:f[u]=find(f[u]); } bool solve() { int i,j,origin=-1,end=-1,start=-1; for(i=0;i<26;++i) if(in[i]>0||out[i]>0){ if(origin==-1) origin=i; if(find(i)!=find(origin)) return false; if(in[i]==out[i]) continue; if(in[i]==out[i]+1&&end==-1){ end=i; continue; } if(in[i]+1==out[i]&&start==-1){ start=i; continue; } return false; } if(start==-1&&end==-1) return true; else if(start!=-1&&end!=-1) return true; else return false; } int main() { int i,j,x,y,z,cases,n; scanf("%d",&cases); while(cases--){ scanf("%d",&n); memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); for(i=0;i<26;++i) f[i]=i; for(i=1;i<=n;++i){ scanf("%s",name); int len=strlen(name); int x=name[0]-'a'; int y=name[len-1]-'a'; int px=find(x); int py=find(y); if(px!=py) f[px]=py; ++out[x]; ++in[y]; } if(solve()==false) printf("The door cannot be opened.\n"); else printf("Ordering is possible.\n"); } return 0; }
poj 1386 Play on Words 有向图欧拉路径判断
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。