首页 > 代码库 > POJ 1300 Door Man(欧拉回路的判定)
POJ 1300 Door Man(欧拉回路的判定)
题目链接
题意 : 庄园有很多房间,编号从0到n-1,能否找到一条路径经过所有开着的门,并且使得通过门之后就把门关上,关上的再也不打开,最后能回到编号为0的房间。
思路 : 这就是一个赤裸裸的判断欧拉通路的问题了,但实际上,就只有两种情况能够输出YES,以房间为顶点,连接房间之间的门为边构造图,这两种情况分别是存在欧拉回路和欧拉通路的情况:所有房间都是偶数个门并且起始房间就是0,所以可以回到0,存在欧拉回路;有两个房间的门是奇数个,其余都是偶数个,这种情况下,要求出发房间和0房间的门是奇数个,并且其实房间不能是0,因为不存在0到0的欧拉回路,但是存在别的房间到0的欧拉通路。
1 //POJ 1300 2 #include <stdio.h> 3 #include <string> 4 #include <iostream> 5 #include <string.h> 6 7 using namespace std ; 8 9 int M,N,door[20] ;10 string sh ;11 char sh1[789] ;12 int main()13 {14 while(cin >> sh)15 {16 if(sh == "ENDOFINPUT")17 break ;18 cin >> M >> N ;19 getchar() ;20 int cnt = 0 ;21 memset(door,0,sizeof(door)) ;22 for(int i = 0 ; i < N ; i++)23 {24 gets(sh1) ;25 int len = strlen(sh1) ;26 for(int j = 0 ; j < len ; j++)27 {28 if(sh1[j] != ‘ ‘)29 {30 int d = sh1[j]-‘0‘ ;31 cnt ++ ;32 door[i] ++ ;33 door[d] ++ ;34 }35 }36 }37 cin >> sh ;38 int odd = 0 ,even = 0 ;39 for(int i = 0 ; i < N ; i++)40 {41 if(door[i] % 2) odd ++ ;42 else even ++ ;43 }44 if(odd == 0 && M == 0)45 cout<< "YES "<< cnt <<endl ;46 else if(odd == 2 && M != 0)47 cout << "YES "<<cnt <<endl ;48 else cout<<"NO"<<endl ;49 }50 return 0 ;51 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。