本文主要是介绍hduoj1878 欧拉回路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
Sample Output
1
0
欧拉回路算法思想:深度搜索算法
欧拉回路具有的充要条件:1、是联通图 2、定点的度数都为偶数
#include<stdio.h>
#include<string.h>
int grap[1005][1005];//采用邻接矩阵来存储图
int visit[105]; //用与在遍历时标记该节点的访问与否
int degree[1005]; //用来存储每个节点的度
void dfs(int v,int n) //深搜
{visit[v]=1; for(int i=1;i<=n;i++){if(grap[v][i]&&visit[i]==0){dfs(i,n);}}
}
int main()
{int d,v,i;while(scanf("%d%d",&d,&v)!=EOF&&d) //分别输入点和边 {memset(grap,0,sizeof(grap)); // 初始化数组memset(visit,0,sizeof(visit));memset(degree,0,sizeof(degree));int a,b;int flag=1; //用于标记for(i=0;i<v;i++){scanf("%d%d",&a,&b);grap[a][b]=grap[b][a]=1;degree[a]++;degree[b]++;dfs(1,d); //从节点1开始遍历}for(i=1;i<=d;i++){if(visit[i]==0){flag=0;break;}if(degree[i]%2!=0) //判断顶点的度是否为偶数{flag=0;break;}}if(flag)printf("1\n");elseprintf("0\n");}return 0;}
这篇关于hduoj1878 欧拉回路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!