Uva(10129)+Uva(10054)

这两道题都是和欧拉图的判定有关,一个是有向图,一个是无向图的欧拉图的判定还有一个是有向图= =

先看10129。。。我们把单词的首字母看做是入度,最后一个字符看做是初度,那么这道题就变成图中是否存在欧拉回路。判断有向图的条件是该图是连通图和最多最有两个点的出度不等于入度,其实那两个点就是起点和终点,而且必须是其中一个点的入度比出度恰好大1(作为终点),另一个点的出度比它的入度恰好大1(作为起点)

连通图的话我们用并查集来判断,如果该图是连通图的话,那么他们共用祖先= =

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int p[30];
const int maxn=100000;
int a[30],b[30];
char s[1000];
void init()
{
    for(int i=0;i<26;i++)
    p[i]=i;
}
int find(int x)
{
    return p[x]==x?x:find(p[x]);
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        init();
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            int in=s[0]-‘a‘;
            int out=s[strlen(s)-1]-‘a‘;
            a[in]++;
            b[out]++;
            if(find(in)!=find(out))
            p[find(in)]=find(out);
        }
        int i,j;
        int flag=1;
        for( i=0;!a[i]&&!b[i];i++);
        for(j=i+1;j<26;j++)
        {
            if((a[j]||b[j])&&find(i)!=find(j))
            {
                flag=0;
                break;
            }
        }
        int count=0;
        if(flag)
        {
        //    printf("PPPP\n");
        for(i=0;!a[i]&&!b[i];i++);
        for(j=i+1;j<26;j++)
        {
           if(a[j]>b[j])
           {
                if(a[j]-b[j]>1)
                {
                    flag=0;
                    break;
                }
                else
                count++;
           }
           else if(b[j]>a[j])
           {
              if(b[j]-a[j]>1)
                {
                    flag=0;
                    break;
                }
                else
                count++;
          }
        }
}
        if(!flag||count>2)
        printf("The door cannot be opened.\n");
        else
        printf("Ordering is possible.\n");
    }
    return 0;
}

10054这道题就是给出无向图然后让你判断是存在欧拉回路= =,如果存在,打印其中任一条欧拉回路,无向图的欧拉回路的判断是该图是连通图和图中不存在奇度顶点

打印的话从任一起点出发,递归输出路径= =

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
const int maxn=60;
int mp[maxn][maxn];
int p[60];
int dir[60];
int f[maxn];
int n;
struct node
{
    int u,v;
};
void init()
{
    for(int i=1;i<=50;i++)
    p[i]=i;
}
int find(int x)
{
    return p[x]==x?x:find(p[x]);
}
void dfs(int u)
{
    int v;
    for(v=1;v<=50;v++)
    {
        if(mp[u][v]>0)
        {
            mp[u][v]--;
            mp[v][u]--;
            dfs(v);
            printf("%d %d\n",v,u);//若是有向图的话,先把顶点放进栈内,然后从栈顶开始输出路径
        }
    }
}
int main()
{
    int t,tt;
    int k=0;
    scanf("%d",&t);
       for(tt=0;tt<t;tt++)
       {
           if(tt)
        printf("\n");
        memset(dir,0,sizeof(dir));
        memset(mp,0,sizeof(mp));
        init();
        scanf("%d",&n);
        int a,b;
        for(int i=0;i<n;i++)
        {
           scanf("%d %d",&a,&b);
           mp[a][b]++;
           mp[b][a]++;
           dir[a]++,dir[b]++;
           if(find(a)!=find(b))
           p[find(a)]=find(b);
        }
        printf("Case #%d\n",++k);
        int num=0;
        int i,j;
        int flag=1;
        for(i=1;!dir[i];i++);
        for( j=i+1;j<=50;j++)
        {
            if(dir[j]&&find(j)!=find(i))
            {
                flag=0;
                break;
            }
        }
        if(flag)
        {
            int count=0;
            for(j=i+1;j<=50;j++)
            if(dir[j]&1)
            {
                flag=0;
                break;
            }
        }
        if(!flag)
        {
        printf("some beads may be lost\n");
        continue;
       }
        int u;
        for(u=0;!dir[u];u++);
        dfs(u);
    }
    return 0;
}
时间: 2024-11-08 10:56:43

Uva(10129)+Uva(10054)的相关文章

Play on Words UVA - 10129 欧拉路径

关于欧拉回路和欧拉路径 定义:欧拉回路:每条边恰好只走一次,并能回到出发点的路径欧拉路径:经过每一条边一次,但是不要求回到起始点 ①首先看欧拉回路存在性的判定: 一.无向图每个顶点的度数都是偶数,则存在欧拉回路. 二.有向图(所有边都是单向的)每个节顶点的入度都等于出度,则存在欧拉回路. ②.欧拉路径存在性的判定 一.无向图一个无向图存在欧拉路径,当且仅当   该图所有顶点的度数为偶数   或者  除了两个度数为奇数外其余的全是偶数. 二.有向图一个有向图存在欧拉路径,当且仅当  该图所有顶点的

Play on Words UVA - 10129 (有向图欧拉路径)

Play on Words UVA - 10129 题意:n个单词,问能否收尾相连形成一条链. 把单词首尾字母看做点,单词内部连一条边,问是否存在欧拉路径. 用并查集,当且仅当只有一个点的出度比入度大1一个点的入度比出度大1其它点出度和入度相等时存在欧拉路径. 1 #include<cstdio> 2 #include<cstring> 3 #include<set> 4 #include<iostream> 5 #include<cctype>

uva 10129 Play on Words(欧拉路)

uva 10129 Play on Words Description Play on Words 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 doors, the puzzle is very impo

uva 10047 uva live 2035 The Monocycle bfs

// uva 10047 uva live 2035 bfs // 求最短的嘛,肯定先尝试bfs啦 // 确定状态,首先状态里面得有坐标x,y // 还得有朝向,还得有颜色值 // // 这样就是一个状态里面有着三种属性 // 每个状态都只要经历一次,再经历是没有任何意义的 // 用一个que的思维数组记录就行了. // 按照方向爆搜,我先用f[i][j]记录的就是到 // 这一点的最小距离,但是怎么都过不了样例 // 突然明白了,如果只是这样记录最短距离,是不行的 // 因为每次从队列中取出的

UVa 10129 单词

题意:给定一些单词,单词的尾字母和另一单词的首字母相同,则可以串联,问是否可以将所有的单词串联.单词可重复出现,但每个单词只能用一次:即某单词重复几次,则可用几次. 思路:欧拉道路的应用.欧拉道路,即"一笔画",从图中一结点出发走一条道路,每条边恰好经过一次. 首先要判断图是连通的. 对于无向图,最多只有两个奇点(度数为奇数).且从一奇点出发,到另一奇点终止:若无奇点,则可从任意点出发,最终定会回到该点(欧拉回路). 对于有向图,最多只能有两个点的入度不等于出度,且必须其中一点的出度恰

UVA 10129 Play on Words(欧拉道路)

题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图,判断这个有向图是否可以形成欧拉路就好 注意可能有重边与自环,因此求欧拉路时判断的是是否使用完了所有的边,求起点时注意出度与入度的计算 欧拉道路是从一个点一笔画完整张图(欧拉回路保证回到起点),注意除了起点与终点以外所有的点出度入度相等 起点出度大入度1,终点相反(所有的点出入度相等也可以),根据这

UVA - 10129 Play on Words(欧拉回路+并查集)

2.解题思路:本题利用欧拉回路存在条件解决.可以将所有的单词看做边,26个字母看做端点,那么本题其实就是问是否存在一条路径,可以到达所有出现过的字符端点.由于本题还要求了两个单词拼在一起的条件是前一个单词的右端点和本单词的左端点一样.所以这是一个有向图.根据结论:有向图的底图(忽略边的方向后的图)必须连通:有向图中最多只能有两个端点的入度不等于出度,且必须是其中一点的入度比出度小1,另一点的入度比出度大1.因此先判断端点是否都连通,再判断每个端点的度数是否满足结论即可. 那么,如何判断连通性呢?

UVa 10129 Play On Words【欧拉道路 并查集 】

题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http://blog.csdn.net/hcbbt/article/details/9316301) 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图)连通性,用简单的DFS即可.如果图都不连通,一定不存在欧拉路 2.在条件1的基础上   对于

Play on Words UVA - 10129

题目: 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 doors, the puzzle is very important for us. There is a large number of magne