5-32 哥尼斯堡的“七桥问题” (25分)

5-32 哥尼斯堡的“七桥问题” (25分)_第1张图片

输入格式:

输入第一行给出两个正整数,分别是节点数NN (1\le N\le 10001N1000)和边数MM;随后的MM行对应MM条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到NN编号)。

输出格式:

若欧拉回路存在则输出1,否则输出0。

输入样例1:

6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6

输出样例1:

1

输入样例2:

5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4

输出样例2:

0
/* 凡是由偶点(每个节点的边数)组成的连通图,一定可以一笔画成。*/
/* 并查集 解决问题 度相当与边数*/
#include "iostream" 
#include "cstring"
#include "set"
using namespace std;

#define Max 3000
int Father[Max],Degree[Max];
 

int Find(int x)  //查
{
	if(x==Father[x]) return x;
	else
	return Find(Father[x]);
}
void Union(int x,int y)
{
	 
    Father[x]=y;
   
}
int main()
{ 
   //freopen("1.txt","r",stdin);
   int m,n;				
    scanf("%d%d",&m,&n); //Top ,Edge
   int i;
   for(i=1;i<=m;i++)
   {
	   Father[i]=i;
	   Degree[i]=0;
 
   }
   int x,y;
   int count=m;
   for(i=1;i<=n;i++)
   {
	   scanf("%d%d",&x,&y);
	   Degree[x]++;
	   Degree[y]++;
	   if(Find(x)!=Find(y))
	   {
	     Union(x,y);		 
	   }
   }
   bool One=true;
  
  
   for(i=1;i<=m;i++)
   {
	  if(Degree[i]%2!=0)
	  {
		  One=false;
		  break;
	  }
   }
  
   if(One==true)
   {   
	 set<int> F;
	 for(i=1;i<=m;i++)
	 {
	 F.insert(Find(i));
	 } 
	 if(F.size()==1)
	 printf("1\n");
	 else
     printf("0\n");	   
   }
   else
	  printf("0\n");
   
	return 0 ;
}


5-32 哥尼斯堡的“七桥问题” (25分)_第2张图片

你可能感兴趣的:(5-32 哥尼斯堡的“七桥问题” (25分))