UVA10129 Play on Words【思路】
2017-09-04 14:30
330 查看
题意:能不能把所有字符串,首尾相连接起来
思路:首先做一个粗略的判断,看看所有收尾的字母能不能连到一起,并查集。收尾相连,最多有一个出度比入度大1的字母和入度比出度大1的字母,并且只有这两个字母的入度、出度不同;还有种情况就是所有的字母入度、出度都相同
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1005;
char s[maxn];
int in[maxn],out[maxn];
int pre[maxn],vis[maxn];
void init(int n)
{
for(int i = 1; i <= n; i++)
pre[i] = i;
}
int fid(int x)
{
if(pre[x] == x)
return x;
else
return pre[x] = fid(pre[x]);
}
void he(int x,int y)
{
int nx = fid(x);
int ny = fid(y);
if(nx != ny)
pre[nx] = ny;
}
int main(void)
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(in,0,sizeof in);
memset(out,0,sizeof out);
memset(vis,0,sizeof vis);
for(int i = 0; i < 26; i++)
pre[i] = i;
for(int i = 1; i <= n; i++)
{
scanf("%s",s);
in[s[0]-'a']++;
int len = strlen(s);
out[s[len-1]-'a']++;
he(s[len-1]-'a',s[0]-'a');
vis[s[0]-'a'] = 1;
vis[s[len-1]-'a'] = 1;
}
int flag = 0;
for(int i = 0; i < 26; i++)
{
if(vis[i] && pre[i] == i)
flag++;
}
if(flag != 1)
flag = 0;
int num = 0,num1 = 0,num2 = 0;
for(int i = 0; i < 26; i++)
{
if(in[i] != out[i])
num++;
if(in[i] == out[i] + 1)
num1++;
if(out[i] == in[i] + 1)
num2++;
}
if(num == 0 || (num==2 && num1==1 && num2==1))
;
else
flag = 0;
if(flag)
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
思路:首先做一个粗略的判断,看看所有收尾的字母能不能连到一起,并查集。收尾相连,最多有一个出度比入度大1的字母和入度比出度大1的字母,并且只有这两个字母的入度、出度不同;还有种情况就是所有的字母入度、出度都相同
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1005;
char s[maxn];
int in[maxn],out[maxn];
int pre[maxn],vis[maxn];
void init(int n)
{
for(int i = 1; i <= n; i++)
pre[i] = i;
}
int fid(int x)
{
if(pre[x] == x)
return x;
else
return pre[x] = fid(pre[x]);
}
void he(int x,int y)
{
int nx = fid(x);
int ny = fid(y);
if(nx != ny)
pre[nx] = ny;
}
int main(void)
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(in,0,sizeof in);
memset(out,0,sizeof out);
memset(vis,0,sizeof vis);
for(int i = 0; i < 26; i++)
pre[i] = i;
for(int i = 1; i <= n; i++)
{
scanf("%s",s);
in[s[0]-'a']++;
int len = strlen(s);
out[s[len-1]-'a']++;
he(s[len-1]-'a',s[0]-'a');
vis[s[0]-'a'] = 1;
vis[s[len-1]-'a'] = 1;
}
int flag = 0;
for(int i = 0; i < 26; i++)
{
if(vis[i] && pre[i] == i)
flag++;
}
if(flag != 1)
flag = 0;
int num = 0,num1 = 0,num2 = 0;
for(int i = 0; i < 26; i++)
{
if(in[i] != out[i])
num++;
if(in[i] == out[i] + 1)
num1++;
if(out[i] == in[i] + 1)
num2++;
}
if(num == 0 || (num==2 && num1==1 && num2==1))
;
else
flag = 0;
if(flag)
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
相关文章推荐
- UVa 10129 (并查集 + 欧拉路径) Play on Words
- Uva - 10129 - Play on Words
- UVA Play On Words 10129
- uva 10129 play on words——yhx
- uva 10129 Play on Words
- UVA - 10129 Play on Words(有向欧拉道路存在性)
- UVA - 10129 Play on Words
- UVA 10129-Play on Words(欧拉通路)
- Uva - 10129 - Play on Words
- UVA 10129 Play on Words
- UVa 10129 - Play on Words (欧拉回路, DFS)
- UVa-10129 - Play on Words
- uva 10129 Play on Words
- UVA 10129 Play on Words
- uva 10129 Play on Words(欧拉道路)
- UVa 10129 Play on Words
- UVA - 10129 Play on Words
- UVA 10129 Play on Words
- UVA10129 Play on Words —— 欧拉回路
- uva 10129 poj 1386 hdu 1116 zoj 2016 play on words