您的位置:首页 > 其它

NYOJ 42 一笔画问题

2013-03-19 14:59 232 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int father[1005];
int degree[1005];
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
father[x]=y;
}
int main()
{
int i,a,b,n,p,q,cnt,dnt;
scanf("%d",&n);
while(n--){
cnt=dnt=0;
memset(degree,0,sizeof(degree));
scanf("%d%d",&p,&q);
for(i=1;i<=p;i++)
father[i]=i;
while(q--){
scanf("%d%d",&a,&b);
if(a==b) continue;
degree[a]++;
degree[b]++;
merge(a,b);
}
for(i=1;i<=p;i++){
if(father[i]==i)
cnt++;
if(degree[i]&1)
dnt++;
}
if(cnt==1&&(dnt==0||dnt==2))
puts("Yes");
else
puts("No");
}
//system("pause");
return 0;
}


解题思路: 

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



答案

  16.一笔画问题

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

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

  判断一笔画的方法:

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

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

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

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

今天又复习了一遍并查集的概念,参见:http://www.nocow.cn/index.php/%E5%B9%B6%E6%9F%A5%E9%9B%86
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: