一笔画问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。
规定,所有的边都只能画一次,不能重复画。
/*⒈凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为终点画完此图。
⒉凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另一个奇点终点。
⒊其他情况的图都不能一笔画出。(有偶数个奇点除以2便可算出此图需几笔画成。)
1、判断图是否连通2、判断点是奇点的个数.
*/
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Queue;
public class nyoj_一笔画问题_42 {
static int i,j,P,Q,x,y,sum,count,t,m;
static boolean [][] map;
static boolean []vis;
private static void BFS() {
Queue<Integer> q = new LinkedList<Integer>();
//值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
q.offer(1);//加入1入队
vis[1]=true;
while(!q.isEmpty()){
t=q.poll();
count++;
sum=0;
for(i=1; i<=P; i++){
if(map[t][i]){ //标记查找过的边,以免重复查找
if(!vis[i]){ //标记查找过的节点,
vis[i]=true;
q.offer(i);
}
sum++;
}
}
if(sum%2==1)//记录奇数边的个数
m++;
}
}
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int T = sc.nextInt();
while(T-->0){
P = sc.nextInt();
Q = sc.nextInt();
count=0;
m=0;
map = new boolean [P+1][P+1];
vis = new boolean [P+1];
while(Q-->0){
x=sc.nextInt();
y=sc.nextInt();
map[x][y]=map[y][x]=true;//用邻接矩阵存储图相关的关系
}
BFS();
if(P == count && (m==0 || m==2))//走得通,是连通图的话,count==P结点数
System.out.println("Yes");
else
System.out.println("No");
}
}
}