uva 10596 - Morning Walk
题意:一个人想从家走遍整个城市,不走重复的路,问有没有可能。明显的欧拉问题。
输入:第一行两个数字,前一个代表有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; }