一笔画问题 42 (dfs) 好题

来源:互联网 发布:中国手机网民最新数据 编辑:程序博客网 时间:2024/04/30 20:12

一笔画问题

时间限制:3000 ms  |           内存限制:65535 KB
难度:4
描述

zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

规定,所有的边都只能画一次,不能重复画。

输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。
输出
如果存在符合条件的连线,则输出"Yes",
如果不存在符合条件的连线,输出"No"。
样例输入
24 31 21 31 44 51 22 31 31 43 4
样例输出
NoYes
//结题依据:

在18世纪的哥尼斯堡城里有七座桥。当时 有很多人想要一次走遍七座桥,并且每座桥只能经过一次。这就是世界上很有名的哥尼斯堡七桥问题。你能一次走遍这七座桥,而又不重复吗?(自己动手画画吧)

答案

  16.一笔画问题

  这个问题,实际上是一笔画问题。

  一笔画就是一笔可以画成一个图。

  判断一笔画的方法:

  ①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。

  ②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。

  一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。

  哥尼斯桥问题,就是一笔画问题。但因A、B、C、D四个点都是奇点即奇点的个数是4,而不是0或2,所以不是一笔画,也就不能一次走遍,而又不重复。

 
#include<stdio.h>#include<string.h>int a[1010],b[1010],map[1010][1010];int n,m;void dfs(int x){int y=x;b[x]=1;for(y=1;y<=n;y++){if(y!=x&&map[x][y]&&!b[y])dfs(y);}}int main(){int t,x,y,flag;scanf("%d",&t);while(t--){int cnt=0;flag=1;scanf("%d%d",&n,&m);memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(map,0,sizeof(map));while(m--){scanf("%d%d",&x,&y);map[x][y]=map[y][x]=1;a[x]++;a[y]++;}dfs(1);for(int i=1;i<=n;i++){map[i][i]=1;if(b[i]==0)flag=0;if(a[i]&1)cnt++;}if(flag){if(cnt==2||cnt==0)printf("Yes\n");elseprintf("No\n");}elseprintf("No\n");}return 0;}
//并查集解
 
#include<stdio.h>#include<string.h>int a[1010],b[1010];int find(int x){while(x!=a[x])x=a[x];return x;}int merge(int x,int y){int fx,fy;fx=find(x);fy=find(y);if(fx!=fy)a[fx]=fy;}int main(){int t;int n,m;int i,j;int x,y;int num,cnt;scanf("%d",&t);while(t--){num=cnt=0;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){a[i]=i;b[i]=0;}while(m--){scanf("%d%d",&x,&y);b[x]++;b[y]++;merge(x,y);}for(i=1;i<=n;i++){if(a[i]==i){num++;if(num>1)break;}if(b[i]&1)cnt++;}if(num>1)printf("No\n");else{if(cnt==0||cnt==2)printf("Yes\n");elseprintf("No\n");}}return 0;}
//刚开始是想这样写的,但技术不行,一直写不对,明天再写。。。
//今天又修改了一下,虽然测试数据过了,但代码有个很大个漏洞,就是每次都是从1开始的,这显然是错误的。。。还是技术不行啊
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int map[11][11];int n,m,flot;void dfs(int x,int cnt){if(flot)return;int i;if(cnt==n-1){flot=1;printf("Yes\n");return ;}for(i=1;i<=n;i++){if(map[x][i]){map[x][i]=map[i][x]=0;dfs(i,cnt+1);}}}int main(){int t;int x,y;scanf("%d",&t);while(t--){memset(map,0,sizeof(map));scanf("%d%d",&n,&m);while(m--){scanf("%d%d",&x,&y);map[x][y]=map[y][x]=1;}flot=0;dfs(1,0);if(!flot)printf("No\n");}return 0;}

 



0 0
原创粉丝点击