poj1386有向图判断是否存在欧拉回路或者欧拉路

Posted Billyshuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1386有向图判断是否存在欧拉回路或者欧拉路相关的知识,希望对你有一定的参考价值。

 

 

 

 

 有向图的图联通是指基图联通,也就是把有向图的边改成无向图然后看是否连通。判断联通可用dfs或者并查集。

 

题意就是给你n个由小写字母构成的字符串,问你能不能将这n个字符串连接起来,B能接在A后面的条件是A的最后一个字母==B的第一个字母。

 

然后就是将26个小写字母看成顶点集,对于一个字符串,其首字母向尾字母连一条单向边构图。

 

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=35;
int in[N],out[N],ans;
char s[N*100];
vector<int>G[N];
bool vis[N];
void dfs(int u)
{
    for(int i=0; i<(int)G[u].size(); ++i)
    {
        if(vis[G[u][i]])
        {
            ++ans;
            vis[G[u][i]]=0;
            dfs(G[u][i]);
        }
    }
}
int main()
{
    int T,n;
    for(scanf("%d",&T); T--;)
    {
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=0; i<35; ++i) G[i].clear();
        int cont=ans=0;
        while(n--)
        {
            scanf("%s",s);
            int st=s[0],ed=s[strlen(s)-1];
            st-=\'a\',ed-=\'a\';
            G[st].push_back(ed);
            G[ed].push_back(st);
            ++in[ed];
            ++out[st];
            if(!vis[st]) ++cont;vis[st]=1;
            if(!vis[ed]) ++cont;vis[ed]=1;
        }
        for(n=0; n<35; ++n) if(!G[n].empty()) break;
        vis[n]=0,++ans;
        dfs(n);
        if(ans!=cont)
        {
            puts("The door cannot be opened.");
            continue;
        }
        bool ok=1,k1=0,k2=0;
        for(int i=0; i<26; ++i)
        {
            if(in[i]==out[i]) continue;
            else if(in[i]-out[i]==1&&!k1) k1=1;
            else if(out[i]-in[i]==1&&!k2) k2=1;
            else
            {
                ok=0;
                break;
            }
        }
        if(ok) puts("Ordering is possible.");
        else puts("The door cannot be opened.");
    }
}

 

以上是关于poj1386有向图判断是否存在欧拉回路或者欧拉路的主要内容,如果未能解决你的问题,请参考以下文章

poj1386 Play on Words

欧拉回路

POJ1386Play on Words[有向图欧拉路]

ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

poj1386单词连接(欧拉欧拉欧拉)

POJ 1386 Play on Words(有向欧拉通路 连通图)