您的位置:首页 > 其它

hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】

2016-03-13 19:29 309 查看
 
word!word!
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 58(20 users)Total Accepted: 25(16 users)Rating: 







Special Judge: No
Description
为了备考CET-6,ikki在家里每天都背着单词,但是背多了就难免会有点烦躁。word!word!.....背不完的word。

一次ikki在写单词的时候发现:一些紧靠在一起的单词,前一个单词的最后一个字母和后面一个单词的首字母相同,这些单词看起来就像被“连”在了一起,甚至首尾单词还能相接形成环状,于是她想知道可不可以通过适当的改变纸上写的一些单词的顺序之后使得这些单词可以全部“连”在一起。例如:样例1中的4个单词fly
self raw year,可以这样“连”起来:self-fly-year-raw;样例2中abc-cde-efa 并且最后一个单词的最后一个字母和第一单词的第一个字母相同,这样就形成了环状。

Input
多组测试数据,第一行一个整数T表示测试数据的组数。

对于每组测试数据:第一行一个整数n(1<n<100)表示纸上写的单词的个数,第二行包括n个单词,每个单词长度不超过
 10,且全部由小写字母组成。

Output
对于每组数据,如果可以把全部单词连接起来并能形成环状则输出"circle” ,否则如果可以把所有单词连接起来形成一

条直线则输出"path”,否则输出"oh no”。

Sample Input
3

4

fly self raw year

3

abc cde efa

3

mac create delete
Sample Output
path

circle

oh no
欧拉路、欧拉回路的有向图判断:

欧拉回路:所有节点入度==出度、

欧拉路:除起点和终点外所有节点的入度==出度,终点入度-出度==1&&起点出度-入度==1

我们设置两个数组ru【】,chu【】表示各个节点的入度和出度。在输入字符的时候,处理首位字母的入度和出度,在最终判断时候加上上述满足的条件即可。

AC代码:

#include<stdio.h>
#include<string.h>
using namespace std;
int ru[105];
int chu[105];
int vis[105];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(ru,0,sizeof(ru));
memset(chu,0,sizeof(chu));
memset(vis,0,sizeof(vis));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char str[15];
scanf("%s",str);
int x=str[0]-'a';
int y=str[strlen(str)-1]-'a';
ru[x]++;
chu[y]++;
vis[x]=1;
vis[y]=1;
}
int zhongdian=0;
int qidian=0;
int cont=0;
for(int i=0;i<30;i++)
{
if(vis[i]==1)
{
if(ru[i]!=chu[i])
{
if(ru[i]-chu[i]==1)
{
zhongdian++;
}
if(chu[i]-ru[i]==1)
{
qidian++;
}
cont++;
}
}
}
if(cont==0)
{
printf("circle\n");
}
else if(cont==2)
{
if(zhongdian==1&&qidian==1)
{
printf("path\n");
}
else
{
printf("oh no\n");
}
}
else
{
printf("oh no\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息