【HDU-1878】 欧拉回路

来源:互联网 发布:excel同一列重复数据 编辑:程序博客网 时间:2024/06/14 14:51


点击打开链接


欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15220    Accepted Submission(s): 5820


Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
 

Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 

Sample Input
3 31 21 32 33 21 22 30
 

Sample Output
10

//            无向图:
//            1 ) 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路; 2 ) 如果欧拉通路是回路,则称此回路为欧拉回路; 3 ) 具有欧拉回路的无向图G称为欧拉图。
//            有向图:
//            1 ) 设D是有向图,D的基图连通,则称经过D的每条边一次并且仅一次的有向路径为有向欧拉通路;  2 ) 如果有向欧拉通路是有向回路,则称此有向回路为有向欧拉回路;  3 ) 具有有向欧拉回路的有向图D称为有向欧拉图。

//代码如下:

#include <cstdio>#include <cstring>const int maxn = 1e6 + 10;int n,m;int par[maxn];int du[maxn];int k;void  init(int n){memset(du,false,sizeof(du));for (int i = 1 ; i <= n ; i++)  par[i] = i;}int find(int x){int p = x;while (x != par[x]) { x = par[x]; }while(p != x) { int j = par[x];    par[x] = x; p = j; }return x;}void unite(int x,int y){int fa = find(x);int fb = find(y);if ( fa != fb) { par[fa] = fb; k++; }}int main(){    while (~scanf("%d",&n) && n)      {      int a,b;      init(n);      scanf("%d",&m);      k = 0;      for (int i = 0 ; i < m ; i++)       {        scanf ("%d%d",&a,&b);        du[a]++;        du[b]++;           unite(a,b); }if (k != n - 1) {  printf ("0\n");         continue; }int flag = 1;for (int i = 0 ; i < n ; i++)  {   if (du[i] % 2 != 0)    {    flag = 0;    break;  }  }if (flag){printf ("1\n");}    else        printf("0\n");  }return 0;}



原创粉丝点击