欧拉回路-基础题

来源:互联网 发布:淘宝详情模板 编辑:程序博客网 时间:2024/04/30 12:52
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

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

// 形成欧拉回路条件:①连通 ②每个节点度数为偶数
// 节点度数:一个节点相接的边数

#include <cstdio>#include <cstring>#define MAX 1002int vist[MAX],map[MAX][MAX],degree[MAX];int n,m;void dfs(int cur){int i;vist[cur] = 1;for(i = 1; i <= n; i++)if(!vist[i] && map[i][cur] )dfs(i);}int main(){int i,a,b;int flag;  while( ~scanf("%d%d",&n,&m),n ){memset(degree,0,sizeof(degree));memset(map,0,sizeof(map));memset(vist,0,sizeof(vist));for( i = 0; i < m; i++ ){scanf("%d%d",&a,&b);map[a][b] = map[b][a] = 1;degree[a]++;degree[b]++;}flag = 1;dfs(1);for( i = 1; i <= n; i++ ){if( degree[i] % 2 ){flag = 0;break;}if( !vist[i] ){flag = 0;break;}}if(flag)printf("1\n");elseprintf("0\n");}    return 0;}


0 0
原创粉丝点击