题意:一个人想从家走遍整个城市,不走重复的路,问有没有可能。明显的欧拉问题。
输入:第一行两个数字,前一个代表有N个点,后一个代表R条路,接着输入这r条路分别连着哪两个点。
判断是否连通:任意一个点是否可以访问所有节点。
判断是否欧拉回路:离散数学中有讲过,图论知识,判断每个点的度数是否为偶数度。
这题坑的地方在于他只要走过所有的路就可以了,而并非所有的点。但也不能光是几个孤立的点,所以要有一个特殊值的判断,即N==0或 R==0时肯定是不可能的所以代码如下
//判断是否是强连通图,是否存在欧拉回路
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int N,R;
int way[1000][1000],used[1000],dos[1000];
void dfs(int x)//如果从任一节点出发能访问所有节点,则为连通
{
for(int i=0;i<N;i++){
if(!used[i]&& way[x][i]){
used[i]=1;
dfs(i);
}
}
}
bool Isconnect()
{
for(int i=0;i<N;i++){
if(dos[i]!=0){
if(used[i]==0){
return false;
}
}
}
return true;
}
bool Oula()
{
for(int i=0;i<N;i++){
if(dos[i]%2 != 0 ){
return false;
}
}
return true;
}
int main()
{
while(~scanf("%d%d",&N,&R)){
memset(way,0,sizeof(way));
memset(used,0,sizeof(used));
memset(dos,0,sizeof(dos));
for(int i=0;i<R;i++){
int x,y;
scanf("%d%d",&x,&y);
way[x][y]=1;
way[y][x]=1;
dos[x]+=1;
dos[y]+=1;
}
dfs(0);
bool flag=Isconnect();
if (N == 0|| R==0){
flag=false;
}
if(flag){//判断是否每个节点的度数都为偶数
bool flag2=Oula();
if(flag2){
printf("Possible\n");
}
else {
printf("Not Possible\n");
}
}
else{
printf("Not Possible\n");
}
}
return 0;
}