一笔画问题(floyd+oular+dfs)

一笔画问题

时间限制: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"。
样例输入
2
4 3
1 2
1 3
1 4
4 5
1 2
2 3
1 3
1 4
3 4
样例输出
No
Yes

题解:与前边发的相似,区别在于dfs与并查集

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int P;
 4 int map[1010][1010],visited[1010],path[1010];
 5 int dfs(int x){
 6     visited[x]=1;
 7     for(int i=1;i<=P;++i){
 8         if(map[x][i]&&!visited[i])dfs(i);
 9     }
10 }
11 int main(){
12     int N,Q,begin,end,flot,oular;
13     scanf("%d",&N);
14     while(N--){
15         memset(path,0,sizeof(path));
16     memset(map,0,sizeof(map));
17     memset(visited,0,sizeof(visited));
18         scanf("%d%d",&P,&Q);
19         while(Q--){
20             scanf("%d%d",&begin,&end);
21             path[begin]++,path[end]++;
22             map[begin][end]=map[end][begin]=1;
23         }
24         dfs(1);flot=1;oular=0;
25         for(int i=1;i<=P;++i){
26             if(!visited[i])flot=0;
27             if(path[i]&1)oular++;
28         }
29         if(!flot)puts("No");
30         else if(oular==0||oular==2)puts("Yes");
31         else puts("No");
32     }
33     return 0;
34 }

 
时间: 2024-11-13 14:54:44

一笔画问题(floyd+oular+dfs)的相关文章

UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量)

题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归该点与其他点能互达的点: 1 #include <cstdio> 2 #include <vector> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 using n

hdu 2544 最短路(Dijkstra Or Floyd Or dfs)

Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包

hdu 1874 畅通工程续 (Dijkstra or Floyd or Dfs)

Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰.现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束. 每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0

POJ - 2594 Treasure Exploration 二分图匹配 + floyd

题目大意:在火星上有N个矿,有点矿之间存在着一条路,由于在火星比较特殊,该路变成了单向路,且机器人只能出现在这条路的两个端点,问最少需要派多少机器人,才能探清这些矿 解题思路:路可以拼接起来形成一条新的路,所以在所给的条件下还可以再扩展,用floyd将所有能连通的点找出来 接下来就是二分匹配的过程了,求出最大匹配数,在用n-最大匹配数就是答案了 #include<cstdio> #include<cstring> #include<vector> using names

STOI爆零记~

又是一年stoi,回想起去年stoi爆零的事还历历在目,仿佛就在昨天,去年爆零的感觉好像现在还感受得到.. 其实今年stoi我没有给自己太大pressure,目标就是能进市队就好了..(结果还是考挂并且被初一神虐的渣..) 感觉自己很早就到了山区学校(金中..),没想到来的时候基本各位dalao都到了,不管怎样先orz,rp++. 在金中校门口背了一下模板(spfa,树状数组,高精度...等等),然后惊奇地发现今年竟然有两位龙实的dalao,顿时感觉自己地位难保.. 7:50进去,到机房门口..

【第41套测试题NOIP2007】【排序】【DP】【高精度】【树】【图上路径】

先说点题外话,这两天的入学考试,炸了……语文有史以来最差,数学有史以来最差……还有4科,估计全炸……悲痛的心情,来调程序.这套题是8.31考的,从昨天晚上开始改的,因为第三题迟迟不想写,才拖到了现在.. 题目: P1816    统计数 Accepted 标签:NOIP提高组2007 描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 格式

洛谷 P1690 贪婪的Copy

P1690 贪婪的Copy 题目描述 Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi<=N)区域.Copy还得知了每个区域之间的距离.现在Copy从1号区域出发,要获得所有的宝藏并到n号区域离开.Copy很懒,只好来找你为他寻找一条合适的线路,使得他走过的距离最短. 输入输出格式 输入格式: 第一行一个正整数N(1<=N<=100) 接下来一个N*N的矩阵,第i+

poj3311Hie with the Pie状压dp

tsp,但是它可以每个点经过不止一次,所以求一遍最短路,然后搞. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #i

NYoj-42-一笔画问题-DFS

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<