poj 1386 欧拉回路判定

奇怪的是,我的判定是不是联通的部分出问题了

先贴个对的:

#include <cstdio>
#include <map>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;

const int SIZE = 100000+10;
const int SSIZE = 1000 +10;
const int tb = 26;

int idx(char x)
{
    return x-'a';
}

int n,parent[tb],ideg[tb],odeg[tb],e[tb];

void init()
{
    for(int i=0;i<tb;i++)
    {
        parent[i]=i;
        e[i]=ideg[i]=odeg[i]=0;
    }
}

int Find(int x)
{
    if(x!=parent[x])parent[x]=Find(parent[x]);
    return parent[x];
}

void Union(int x, int y)
{
    x=Find(x);
    y=Find(y);
    if(x!=y)parent[y]=x;
}

int main()
{
    //freopen("poj1386.txt","r",stdin);
    int ncase;
    char str[SIZE];
    scanf("%d",&ncase);
    while(ncase--)
    {
        int u,v;
        scanf("%d",&n);
        init();
        for(int i=0;i<n;i++)
        {
            scanf("%s",str);
            ideg[ u=idx( str[strlen(str)-1]) ]++;
            odeg[ v=idx( str[0]) ]++;
            e[u]=e[v]=1;
            Union(u, v);
        }

        int connect=1,tmp=Find(u);

        for(int i=0;i<tb;i++)
        {
            if(e[i]&&tmp!=Find(i))
            {
                connect=0;
                break;
            }
        }

        if(!connect)
        {
            printf("The door cannot be opened.\n");
            continue;
        }
        /*int scnt=0;
        for(int i=0;i<tb;i++)
            if(e[i] && Find(i) == i)
                scnt++;
        if(scnt>1)
        {
            printf("The door cannot be opened.\n");
            continue;
        }*/

        int acnt=0,bcnt=0,cnt=0;
        for(int i=0;i<tb;i++)
            if(e[i])
            {
                if(ideg[i] == odeg[i])continue;
                if(ideg[i] == odeg[i]+1 )
                {
                    acnt++;
                    continue;
                }
                if(odeg[i] == ideg[i]+1 )
                {
                    bcnt++;
                    continue;
                }
                cnt++;
            }
        //if(cnt){printf("The door cannot be opened.\n");continue;}
        if((!acnt&&!bcnt&&!cnt) || (acnt==1&&bcnt==1&&cnt==0))printf("Ordering is possible.\n");
        //if(acnt<=1 && bcnt<=1)printf("Ordering is possible.\n");
        else printf("The door cannot be opened.\n");
    }
    return 0;
}

但是这样判断联通就WA得很惨,不晓得为什么,求大神指教:

        int connect=1,tmp,i;
        for(i=0;i<tb;i++)
            if(e[i])
            {
                tmp=Find(i);
               // i--;
                break;
            }

        for(;i<tb;i++)
            if(e[i] && tmp!=Find(i))
        {
            connect=0;
            break;
        }
时间: 2024-08-01 17:09:40

poj 1386 欧拉回路判定的相关文章

poj 1386 Play on Words(有向图欧拉回路)

1 /* 2 题意:单词拼接,前一个单词的末尾字母和后一个单词的开头字母相同 3 思路:将一个单词的开头和末尾单词分别做两个点并建一条有向边!然后判断是否存在欧拉回路或者欧拉路 4 5 再次强调有向图欧拉路或欧拉回路的判定方法: 6 (1)有向图G为欧拉图(存在欧拉回路),当且仅当G的基图连通,且所有顶点的入度等于出度. 7 (2)有向图G为半欧拉图(存在欧拉道路),当且仅当G的基图连通,且存在顶点u的入度比出度大1.v的入度比出度小1, 8 其它所有顶点的入度等于出度(顶点u,v的个数必须都是

POJ 1041 John&#39;s trip Euler欧拉回路判定和求回路

就是欧拉判定,判定之后就可以使用DFS求欧拉回路了.图论内容. 这里使用邻接矩阵会快很多速度. 这类题目都是十分困难的,光是定义的记录的数组变量就会是一大堆. #include <cstdio> #include <cstring> #include <stack> #include <vector> using namespace std; struct Edge { int ed, des; Edge(int e = 0, int d = 0) : ed

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

欧拉回路判定与求解

图G是欧拉图,即存在欧拉回路的条件::smile: 1.图是联通的 2.对于无向图,奇度数点个数为0.对于有向图,每个顶点出度等于入度. 欧拉回路算法模板(链式前向星和DFS实现): int ans[N]; int k = 0; int vis[2*M]; void DFS(int now) { for(int u=first[now];u!=-1;u=G[u].next) { if(!vis[u]) { vis[u] = 1; //标记当前边 vis[u^1] = 1; //标记反向的另一条边

POJ 1386 Play on Words(欧拉图的判断)

Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11838   Accepted: 4048 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 ther

poj 1386 欧拉路径

1 /* 2 题意:给出N个单词,一个单词的头字母和另一个单词的尾字母相同则可以相连,问这N个单词是否能完全相连成一行 3 4 题解:求欧拉路径 5 首先以每个单词的首字母和尾字母为点并且连边,然后用DFS求该图是否连通,然后根据点的入度和出度判断是否存在 6 欧拉路径或者欧拉回路(存在回路也是符合要求的) 7 */ 8 #include <cstdio> 9 #include <cstring> 10 11 int map[30][30]; 12 int in[30],out[3

poj 2513 欧拉回路+并查集判断是否联通+Trie树

http://poj.org/problem?id=2513 最初看到 第一感觉---map  一看250000的数据量 果断放弃 然后记得以前看过,trie代替map,尤其当数据量特别大的时候 学到了: 1.Trie代替map的思想,可以在单词结尾的tree[i][tk]  这个i作为字符串对应的int值 ,当然这个int值也可以用于建立并查集 2.接上,通过并查集判断,所有的点在同一个集合图就是联通的,否则不联通,注意tree[i][tk]>0 表示是单词结尾, x=Find(x);//这句

POJ 1386 Play on Words

欧拉回路问题. 题意是说给你一些字符串,类似于成语接龙,上一个字符串尾字母必须和下一个字符串首字母相同. 把所有字符串连成一串. 根据定理判断欧拉通路,然后DFS判连通(并查集也可) 没注意题意 字符串开了str[100] 结果RE.结果字符串最长有1000.改了就AC了. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm>

混合图的欧拉回路判定

对于有向图和无向图的欧拉回路判定,很容易做到.那对于混合图呢?? 混合图就是图中既存在无向边又存在有向边的图. 至于解法: 转载自这里 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路. 好了,现在每个点入度和出度之差均为偶数.那么将这个偶数除以2,得x.也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出 = 入.如果