您的位置:首页 > 其它

UVa-10129 单词

2015-12-16 22:36 260 查看
分析:欧拉回路的应用

欧拉回路:

一.无向图

欧拉回路:每个顶点度数都是偶数

欧拉路:所有点度数为偶数,或者只有2个点度数为奇数

二.有向图(非混合)

欧拉回路:每个顶点入度等于出度

欧拉路:每个顶点入度等于出度;

或者只有1个点入度比出度小1, 从这点出发,只有1个点出度比入度小1,从这个点结束,其他点入度等于出度

三.混合图(有的边单向,有的边不确定方向)

本题就是运用了欧拉回路与DFS的知识

#include<stdio.h>

#include<string.h>

#define MM 27

int N,a[MM][MM],vis[MM],in[MM],out[MM],count;

int dfs(int u,int total)

{

int j;

if(total==count) return 1;

vis[u]=1;

for(j=0;j<26;j++)

{

if(a[u][j]&&!vis[j])

{

if(dfs(j,total+1))

return 1;

}

}

return 0;

}

int main()

{

int i,T,m,u,v,L;

char s[1100],b[]={"abcdefghijklmnopqrstuvwxyz"};

scanf("%d",&T);

while(T--)

{

memset(a,0,sizeof(a));

memset(in,0,sizeof(in));

memset(out,0,sizeof(out));

memset(vis,0,sizeof(vis));

count=0;

scanf("%d",&N);getchar();

for(i=0;i<N;i++)

{

gets(s);L=strlen(s);

u=strchr(b,s[0])-b;

v=strchr(b,s[L-1])-b;

in[u]++;

out[v]++;

a[u][v]=1;

if(!vis[u])

{

vis[u]=1;

count++;

}

if(!vis[v])

{

vis[v]=1;

count++;

}

}

memset(vis,0,sizeof(vis));

for(i=0;i<26;i++)

{

if(in[i]!=0||out[i]!=0)

break;

}

if(!dfs(i,1))

printf("The door cannot be opened.\n");

else

{

m=0;

for(i=0;i<26;i++)

{

if(in[i]!=0||out[i]!=0)

{

if(in[i]-out[i]==1||in[i]-out[i]==-1)

m++;

else

{

if(in[i]!=out[i])

{

m=-1;break;

}

}

}

}

if(m==0||m==2)

printf("Ordering is possible.\n");

else

printf("The door cannot be opened.\n");

}

}

return 0;

}

FAQ | About Virtual Judge | Forum | Discuss | Open Source Project

All Copyright Reserved ?2010-2014 HUST ACM/ICPC TEAM

Anything about the OJ, please ask in the forum, or contact author:Isun
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: