分析:欧拉回路的应用
欧拉回路:
一.无向图
欧拉回路:每个顶点度数都是偶数
欧拉路:所有点度数为偶数,或者只有2个点度数为奇数
二.有向图(非混合)
欧拉回路:每个顶点入度等于出度
欧拉路:每个顶点入度等于出度;
或者只有1个点入度比出度小1, 从这点出发,只有1个点出度比入度小1,从这个点结束,其他点入度等于出度
三.混合图(有的边单向,有的边不确定方向)
一.无向图
欧拉回路:每个顶点度数都是偶数
欧拉路:所有点度数为偶数,或者只有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;
}
#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
All Copyright Reserved ?2010-2014 HUST ACM/ICPC TEAM
Anything about the OJ, please ask in the forum, or contact author:Isun