hdu 1116 poj 1386 欧拉回路并查集
2017-04-26 18:29
381 查看
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn =30;
int pre[maxn],in[maxn],out[maxn];
int n;
int num, len; //单词个数,每个单词长度
int start, End; //转化为边
char s[1010];
int innum, outnum; //记录入度出度不相等顶点个数
int root; //根结点个数
bool flag; //判断连通性
bool flag1; //判断入度和出度是否是1或者0
bool vis[maxn];
int ffind(int x)
{
return x == pre[x]?x:pre[x];
}
void Union(int x,int y)
{
int roox, rooy;
roox = ffind(x);
rooy = ffind(y);
if(roox != rooy)
pre[roox] = rooy;
}
int main()
{
int t;
scanf("%d",&t);
for(int i = 1; i <= t;i++)
{
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int i = 0 ; i <maxn; i++)
pre[i] = i;
innum = outnum = root = 0;
flag1 =flag = 1;
scanf("%d",&n);
for(int i = 1; i<= n;i++)
{
scanf("%s",s);
len = strlen(s);
start = s[0]-'a'+1;
End = s[len-1]-'a'+1;
vis[start] = 1;
vis[End] = 1;
out[start]++;
in[End]++;
Union(start,End);
}
for(int i = 0 ;i <maxn; i++)
{
if(vis[i])
{
if(pre[i] == i)
root++;
if(in[i]!=out[i])
{
if(in[i] - out[i] == 1)
outnum++;
else
if(out[i]-in[i] == 1)
innum++;
else flag1 = 0;
}
}
if(root>1){
flag = 0;
break;}
}
if((flag&&flag1&&outnum == 0&&innum==0)||(flag&&flag1&&outnum==1&&innum ==1))
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
#include<stdio.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn =30;
int pre[maxn],in[maxn],out[maxn];
int n;
int num, len; //单词个数,每个单词长度
int start, End; //转化为边
char s[1010];
int innum, outnum; //记录入度出度不相等顶点个数
int root; //根结点个数
bool flag; //判断连通性
bool flag1; //判断入度和出度是否是1或者0
bool vis[maxn];
int ffind(int x)
{
return x == pre[x]?x:pre[x];
}
void Union(int x,int y)
{
int roox, rooy;
roox = ffind(x);
rooy = ffind(y);
if(roox != rooy)
pre[roox] = rooy;
}
int main()
{
int t;
scanf("%d",&t);
for(int i = 1; i <= t;i++)
{
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int i = 0 ; i <maxn; i++)
pre[i] = i;
innum = outnum = root = 0;
flag1 =flag = 1;
scanf("%d",&n);
for(int i = 1; i<= n;i++)
{
scanf("%s",s);
len = strlen(s);
start = s[0]-'a'+1;
End = s[len-1]-'a'+1;
vis[start] = 1;
vis[End] = 1;
out[start]++;
in[End]++;
Union(start,End);
}
for(int i = 0 ;i <maxn; i++)
{
if(vis[i])
{
if(pre[i] == i)
root++;
if(in[i]!=out[i])
{
if(in[i] - out[i] == 1)
outnum++;
else
if(out[i]-in[i] == 1)
innum++;
else flag1 = 0;
}
}
if(root>1){
flag = 0;
break;}
}
if((flag&&flag1&&outnum == 0&&innum==0)||(flag&&flag1&&outnum==1&&innum ==1))
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
相关文章推荐
- HDU 1116 &&POJ 1386 Play on Words(欧拉回路)
- HDU 1116 && UVA 10129 && POJ 1386 ------ Play on Words(欧拉路径 + 并查集)
- uva 10129 poj 1386 hdu 1116 zoj 2016 play on words
- HDU 1116 Play on Words(并查集,欧拉回路)
- POJ1368 & HDOJ1116 Play on Words(欧拉回路 + 并查集)
- HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)
- POJ1386 Play on Words 欧拉回路[并查集判断连通]
- POJ1386 Play on Words 欧拉回路[并查集判断连通]
- HDU 1116 && POJ 1386 Play on Words(欧拉路径)
- UVa 10129 & HDU 1116 & POJ 1386 - Play on Words
- POJ 1308 hdu 1325 Is It A Tree?【并查集+入度 判断一个有向图是树】
- poj 1703 , hdu 1729 , poj 1182 并查集偏移量应用
- hdu 1878 欧拉回路【并查集入门】
- 欧拉路与欧拉回路的判断 poj 1386
- HDU 1829 & POJ 2492 A Bug's Life (并查集)
- POJ 2513 Colored Sticks 并查集 + 字典树 + 欧拉回路
- HDU 1116 Play on Words(欧拉回路)
- HDU 2818 Building Block, poj 1988 Cube Stacking(带权并查集)
- hdu 1116 欧拉回路
- hdu 3018 图 欧拉回路 并查集