题目:
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 ****************************************************************/