UVA
来源:互联网 发布:高斯模糊算法 cpu消耗 编辑:程序博客网 时间:2024/06/05 09:51
题意:
对于给出的单词,判断能否首尾相连,变成一串。有点串珠子的感觉。
思路:
只要判断是否为欧拉路就可以得出结果。欧拉路形成的前提是所给的图是连通的,这就要用到并查集进行判断。在连通的前提下,形成欧拉路可以有两种状态:
1.所有点的出度都等于入度。
2.除了起点出度比入度大一,终点出度比入度小一,其他点出度都等于入度。
二者满足一种即可。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;char te[1100];int pre[28];int vis[28],du[28];int T,n,x,y,len,t,flag;void de(){for(int i=0;i<28;i++)pre[i]=i;}int find(int x) { if (x != pre[x]) { pre[x] = find(pre[x]); } return pre[x]; } // return pre[x] == x?x:pre[x] = find(pre[x]); //可以用这句代替 int main(){scanf("%d",&T);while(T--){scanf("%d",&n);de();memset(vis,0,sizeof(vis));memset(du,0,sizeof(du));flag=1;for(int i=0;i<n;i++){scanf("%s",te);len=strlen(te);x=te[0]-'a';y=te[len-1]-'a';vis[y]=vis[x]=1;du[x]++;du[y]--;x=find(x);pre[y]=x;}for(int i=0;i<26;i++)//再次压缩路径find(i);for(int i=0;i<26;i++)if(vis[i]==1) {t=pre[i]; break;}for(int i=0;i<26;i++){if(vis[i]==1&&t!=pre[i]) { flag=0;break;}}if(flag==0) {cout<<"The door cannot be opened."<<endl; } else{int fr=0,be=0,i=0;for(;i<26;i++){if(du[i]==1) fr++;else if(du[i]==-1) be++;else if(du[i]!=0){break;}}if(i!=26) cout<<"The door cannot be opened."<<endl;else if((fr==1&&be==1)||(fr==0&&be==0)) cout<<"Ordering is possible."<<endl; else cout<<"The door cannot be opened."<<endl;}}return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- URL中“#” “?” &“”号的作用
- spring boot banner的设置
- HDU6154 CaoHaha's staff(规律,2017中国大学生程序设计竞赛
- JMeter安装步骤
- Excel要不要“引”
- UVA
- collection和collections的区别,以及一些工具类数组与集合转换
- [置顶] Jenkins+Gradle实现android开发 自动打包 上传蒲公英
- user,eng,userdebug版本的差异
- Linux 线程同步的三种方法
- Mysql几种索引方式的区别及适用情况
- 获得随机数
- JavaScript的document和window对象详解
- 排序--快速排序