欧拉定理 如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
判断一笔画的方法:
①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。
所以这个问题完全可以转化策略为:
第一步: 首先我们不管它三七二十几,先进行连通性的判断。
第二步:
(1)如果是连通的,我们来判断此图的度的奇点的个数是0或者是2 ,如果是,则说明这个是欧拉图,即可以一笔画出,反之则不能一笔画出
(2)如果是非连通的,这说明这个图很定不能一笔画出。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 int mp[1010][1010]; 6 int n,p,q,a,b; 7 short vis[1010],c[1010]; 8 9 void dfs(int cur) 10 { 11 vis[cur]=1; 12 for(int i=1;i<=p;i++) 13 { 14 if(mp[cur][i]&&!vis[i]) 15 { 16 dfs(i); 17 } 18 } 19 } 20 21 int main() 22 { 23 scanf("%d",&n); 24 while(n--) 25 { 26 memset(mp,0,sizeof(mp)); 27 memset(vis,0,sizeof(vis)); 28 memset(c,0,sizeof(c)); 29 scanf("%d%d",&p,&q); 30 for(int i=0;i<q;i++) 31 { 32 scanf("%d%d",&a,&b); 33 mp[a][b]=mp[b][a]=1; 34 } 35 int cn=0; 36 for(int i=1;i<=p;i++) 37 { 38 for(int j=1;j<=p;j++) 39 c[i]+=mp[i][j]; 40 if(c[i]%2==1) 41 cn++; 42 } 43 dfs(1); 44 int ok=1; 45 for(int i=1;i<=p;i++) 46 if(!vis[i]) 47 { 48 ok=0; 49 break; 50 } 51 if(ok&&(cn==0||cn==2)) 52 { 53 printf("Yes "); 54 } 55 else 56 printf("No "); 57 } 58 return 0; 59 } 60