hdu1116&&poj1386

链接:点击打开链接

题意:给出一些单词看能否首位相接

代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
int fa[1005],in[1005],out[1005],vis[1005],temp[1005];
char s[1005];
int found(int x){                                       //找根节点
    if(x!=fa[x])
    fa[x]=found(fa[x]);
    return fa[x];
}
int main(){                                             //有向连通图D含有欧拉通路,当且仅当该图为连通图且D中除两个结点外,其余每个结点的入度=出度,
    int t,n,i,j,a,b,sign;                               //且此两点满足deg-(u)-deg+(v)=±1.(起始点s的入度=出度-1,结束点t的出度=入度-1或两个点的入度=出度)
    scanf("%d",&t);                                     //很多题解并没有一些名词的解释,导致看的时候出现很多障碍,下面解释一下
    while(t--){                                         //入度的意思是这一点所连接的边都把这一点作为起点的点的个数,反之出度就是为结束点的点的个数
        cin>>n;                                         //欧拉通路:通过图(无向图或有向图)中所有边且每边仅通过一次通路称为欧拉通路
        for(i=0;i<1005;i++){                            //欧拉回路:相应的回路称为欧拉回路
            fa[i]=i;
            in[i]=out[i]=vis[i]=0;
        }
        while(n--){
            scanf("%s",s);                              //这个题就是判断给出的单词能否收尾链接或成欧拉回路
            a=s[0]-'a';                                 //因此将一个单词看做一条边,首位两个字母看做两个点,求入度和出度
            b=s[strlen(s)-1]-'a';
            vis[a]=vis[b]=1;
            in[a]++;out[b]++;
            if(found(a)!=found(b))                      //用并查集判断图是否联通,欧拉通路的判断前提就是图联通
            fa[found(a)]=found(b);
        }
        sign=0;
        for(i=0;i<26;i++)
        if(vis[i]&&fa[i]==i){
            sign++;
            if(sign>1)
            break;
        }
        if(sign>1){                                     //sign大于1代表除了根节点,还有根节点没有变的点,表示图不连通
        printf("The door cannot be opened.\n");
        continue;
        }
        sign=0;
        for(i=0;i<26;i++){
            if(vis[i]&&in[i]!=out[i])
            temp[sign++]=i;
        }
        if(sign==0){                                    //代表所有点入度和出度相等形成欧拉回路
            printf("Ordering is possible.\n");
            continue;
        }
        if(sign==2){
        if((in[temp[0]]-out[temp[0]]==1&&out[temp[1]]-in[temp[1]]==1)||(in[temp[1]]-out[temp[1]]==1&&out[temp[0]]-in[temp[0]]==1))
        printf("Ordering is possible.\n");              //判断起始点s的入度=出度-1,结束点t的出度=入度-1
        else
        printf("The door cannot be opened.\n");
        }
        else
        printf("The door cannot be opened.\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 12:22:32

hdu1116&&poj1386的相关文章

【poj1386】 Play on Words

http://poj.org/problem?id=1386 (题目链接) 题意 给出n个单词,判断它们能否首尾相接的排列在一起. Solution 将每一格单词的首字母向它的尾字母连一条有向边,那么每一条边就代表一个单词,问题转化为能否不重不漏的走完有向图上所有的边. 连边判是否存在欧拉回路或欧拉路径. 细节 一定要首先判断图的连通性. 代码 // poj1386 #include<algorithm> #include<iostream> #include<cstdlib

HDU1116(欧拉回路+并查集)

先用并查集来判断图是否连通,然后再根据欧拉回路的出度和入度的性质来判断是否为欧拉回路. 关键是建边,我们可以把字符串看成是一条边,首字母为出发点,尾字母为目的点,建边. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <math.

poj1386欧拉回路的判定

#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <ios

hdu1116 欧拉回路

1 //Accepted 248 KB 125 ms 2 //欧拉回路 3 //以26个字母为定点,一个单词为从首字母到末尾字母的一条边 4 //下面就是有向图判断欧拉回路 5 //连通+节点入度和==出度和 或者 存在一对节点一个入度比出度大1,一个小1 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <queue> 10 using namespace s

POJ1386 Play on Words

Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to o

hdu1116敌兵布阵

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 单点更新,区间求和. 1 #include<cstdio> 2 #include<cstring> 3 const int m=50005; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 7 int sum[m<<2]; 8 9 inline void pushplus(int

hdu1116

http://acm.hdu.edu.cn/showproblem.php?pid=1116 1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<iostream> 6 using namespace std; 7 const int N=30; 8 int father[N],vis[N]; 9 int find(

ZOJ2016 POJ1386(有向图的欧拉路判断)

Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9710   Accepted: 3352 Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there

hdu1116 Play on Words--并查集&amp;网络流

原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1116 一:原题内容 Problem Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the