树的判断(poj nyoj hduoj)
题目:
http://ac.jobdu.com/problem.php?pid=1481
http://acm.nyist.net/JudgeOnline/problem.php?pid=129
http://poj.org/problem?id=1308
http://acm.hdu.edu.cn/showproblem.php?pid=1272
题目意思就是判断一些给定的支点构成的树是不是一颗合法的树,
判断是不是一颗合法的树如下:
1、该树只有一个根节点
2、不存在环
对于上述两种情况采用如下进行判断:
1、定义一个标识符,当这个点出现,并且父节点和自己相同的节点个数大于1,表示有多个根节点,反之不是
2、在寻找父节点时,这两点指向同一个父节点,则出现了回路
nyoj 和poj 直接使用下代码就ok ,hdu上面相应的改改(代码最后一个)一开始一直RE 后来看看了题目 是10^5,(纠结了)
/*hdu 1272*/ #include<stdio.h> #include <string.h> #define N 100005 int f[N]; int a[N]; int flag = 1; int max = 0; void init() { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); max = 0; flag = 1; int i; for(i = 0; i <= N; i++) f[i] = i; } int find_f(int x) { if(x == f[x]) return x; else return f[x] = find_f(f[x]); } void add(int x,int y) { int fx = find_f(x); int fy = find_f(y); if(fx != fy) f[fy] = fx; else flag = 0; } int main() { int x,y; int fx,fy; init(); while(1) { scanf("%d%d",&x,&y); if(x == -1 && y == -1) break; if(x ==0 && y == 0) { int t = 0; if(flag) { int i; for(i = 0; i <= max; i++) if(a[i] == 1) { if(i == f[i]) t++; } } if(t > 1) flag = 0; if(flag) printf("Yes\n"); else printf("No\n"); init(); } else { if(flag) { max = max > (x > y ? x : y) ? max: (x > y ? x : y) ; add(x,y); a[x] = 1; a[y] = 1; } } } return 0; }
/*** 判断是否有环,当他们的父相同则会出现环,然后是判断是否还有孤立的点(树存在) */ #include<stdio.h> #include <string.h> #define N 10005 int f[N]; int a[N]; int in[N]; int flag = 1; int max = 0; void init() { memset(a,0,sizeof(a)); memset(in,0,sizeof(in)); memset(f,0,sizeof(f)); max = 0; flag = 1; int i; for(i = 0; i <= N; i++) f[i] = i; } int find_f(int x) { if(x == f[x]) return x; else return find_f(f[x]); } int main() { int x,y; int fx,fy; init(); int tt = 0; while(1) { scanf("%d%d",&x,&y); if(x == -1 && y == -1) break; if(x == 0 && y == 0) { int t = 0,i; if(flag) { for(i = 0; i <= max; i++) if(a[i] == 1) { if(i == f[i]) t++; } } if(t > 1) flag = 0; tt++; if(flag) printf("Case %d is a tree.\n",tt); else printf("Case %d is not a tree.\n",tt); init(); } else { a[x] = 1; a[y] = 1; in[y]++; max = max > (x > y ? x : y) ? max : (x > y ? x : y); if(in[y] > 1) { flag = 0; } if(flag == 1) { fx = find_f(x); fy = find_f(y); //printf("%d %d\n",fx,fy); if(fx != fy) f[fy] = fx; else flag = 0; } } } return 0; }
最后跟新贴一个javaAC全部的代码
1 import java.util.Scanner; 2 3 //判断是否是树 4 5 public class Main { 6 private static My_Tree[] tree = new My_Tree[10007] ;//定义对象数组保存输入的值 7 private static boolean Main_flag = false; 8 private static int t = 1; 9 10 public static void init(){ 11 for(int i = 0; i < 10007; i++) 12 tree[i] =new My_Tree(i,i,0,false); 13 Main.Main_flag = false; 14 } 15 public static int find_f(int x){ 16 if(tree[x].getN() == tree[x].getF()) 17 return tree[x].getF(); 18 else 19 return find_f(tree[x].getF()); 20 } 21 public static void main(String[] args) { 22 Scanner cin = new Scanner(System.in); 23 int n,m; 24 Main.init(); 25 while(true){ 26 n = cin.nextInt(); 27 m = cin.nextInt(); 28 // System.out.println(Main.Main_flag); 29 if(n == -1 && m == -1) 30 break; 31 if(n == 0 && m == 0){ 32 int t_tmp = 0; 33 if(!Main.Main_flag){ 34 for(int i = 0; i < 10007; i++) 35 if(tree[i].isFlag()){ 36 // tree[i].print(); 37 if(tree[i].getF() == tree[i].getN()) 38 t_tmp++; 39 } 40 } 41 if(t_tmp > 1) 42 Main.Main_flag = true; 43 if(!Main.Main_flag) 44 System.out.println("Case "+(Main.t++)+" is a tree."); 45 else 46 System.out.println("Case "+(Main.t++)+" is not a tree."); 47 Main.init(); 48 } 49 else{ 50 int fx,fy; 51 52 tree[n].setFlag(true); 53 tree[m].setFlag(true); 54 tree[m].setIn(tree[m].getIn()+1); 55 if(tree[m].getIn() > 1) 56 Main.Main_flag = true; 57 58 if(!Main.Main_flag){ 59 fx = Main.find_f(n); 60 fy = Main.find_f(m); 61 if(fx != fy) 62 tree[m].setF(fx); 63 else 64 Main.Main_flag = true; 65 } 66 } 67 } 68 } 69 70 } 71 72 class My_Tree{ 73 private int n,f,in; 74 private boolean flag; 75 public My_Tree(int n, int f, int in, boolean flag) { 76 super(); 77 this.n = n; 78 this.f = f; 79 this.in = in; 80 this.flag = flag; 81 } 82 public My_Tree() { 83 super(); 84 } 85 86 public int getN() { 87 return n; 88 } 89 public void setN(int n) { 90 this.n = n; 91 } 92 public int getF() { 93 return f; 94 } 95 public void setF(int f) { 96 this.f = f; 97 } 98 public int getIn() { 99 return in; 100 } 101 public void setIn(int in) { 102 this.in = in; 103 } 104 public boolean isFlag() { 105 return flag; 106 } 107 public void setFlag(boolean flag) { 108 this.flag = flag; 109 } 110 public void print(){ 111 System.out.println("--->"+n+f+in+flag); 112 } 113 } 114 /************************************************************** 115 Problem: 1481 116 User: yangyin1217 117 Language: Java 118 Result: Accepted 119 Time:790 ms 120 Memory:105768 kb 121 ****************************************************************/
yy_room