NYOJ-42-一笔画问题(搜索)

一笔画问题

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

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

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

 

输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0
输出
如果存在符合条件的连线,则输出"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
来源
[张云聪]原创
上传者
张云聪


/*⒈凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为终点画完此图。
⒉凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另一个奇点终点。
⒊其他情况的图都不能一笔画出。(有偶数个奇点除以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 q = new LinkedList();
		                    //值得注意的是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");
		}
		
	}
	
}



 

你可能感兴趣的:(NYOJ-42-一笔画问题(搜索))