描述 | |
---|---|
知识点 | 链表,队列,栈,树,图,数组 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 1、输入点的个数 2、输入点的坐标 |
输出 | 如果可以一笔画这输出 画线顺序 |
样例输入 | 3 1 2 1 3 2 3 |
样例输出 | true |
欧拉定理 如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
判断一笔画的方法:
①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
package easy;
import java.util.*;
public class bihua {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int N = sc.nextInt();
int[][] A = new int[2][N];
for(int i=0;i<N;i++){
A[0][i] = sc.nextInt();
A[1][i] = sc.nextInt();
}
System.out.println(isYibihua(N,A));
}
}
private static boolean isYibihua(int n, int[][] A) {
// TODO Auto-generated method stub
Set<Integer> nodeset = new TreeSet<Integer>();
for(int i=0;i<n;i++){
nodeset.add(A[0][i]);
nodeset.add(A[1][i]);
}
List<Integer> node = new ArrayList<Integer>();
for(int e:nodeset){
node.add(e);
}
int[][] M = new int[node.size()][node.size()];
for(int i=0;i<n;i++){
int e1 = A[0][i];
int e2 = A[1][i];
M[node.indexOf(e1)][node.indexOf(e2)]=1;
M[node.indexOf(e2)][node.indexOf(e1)]=1;
}
return isDFS(M)&&isQidian(M);
}
private static boolean isDFS(int[][] m){
int[] visit = new int[m.length];
Queue<Integer> queue = new LinkedList<Integer>();
visit[0]=1;
queue.add(0);
while(queue.size()>0){
int t = queue.poll();
for(int i=0;i<m.length;i++){
if(m[t][i]==1&&visit[i]!=1){
queue.offer(i);
visit[i]=1;
}
}
}
for(int i=0;i<visit.length;i++){
if(visit[i]!=1)
return false;
}
return true;
}
private static boolean isQidian(int[][] M) {
int[] side = new int[M.length];
for(int i=0;i<M.length;i++){
for(int j=0;j<M.length;j++){
if(M[i][j]==1)
side[i]++;
}
}
int count=0;
for(int i=0;i<side.length;i++){
if(side[i]%2!=0)
count++;
}
if(count==0||count==2)
return true;
else
return false;
}
}