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

 
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-6ikki在家里每天都背着单词,但是背多了就难免会有点烦躁。word!word!.....背不完的word

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

Input

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

对于每组测试数据:第一行一个整数n1<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");
        }
    }
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值