hdu 1325 Is It A Tree?

在hdu 1272 的基础上稍加修改就ac了

1272已经判断了无向情况下是否是树形结构,因此我们只需要多判断一下入度为0的点是否只有一个就好了

#include<iostream>
#define maxn 100000+5
using namespace std;
int a,b;
int flag;
int father[maxn];
int sign[maxn];
int r[maxn];
void ready()
{
	for(int i=1;i<maxn;i++) r[i]=0,father[i]=i,sign[i]=0;
}
int dfs(int x)
{
	if(father[x]!=x)
	{
		father[x]=father[father[x]];
	}
	return father[x];
}
void build(int x,int y)
{
	if(x==y) flag=0;
	else
	{
		if(dfs(x)==dfs(y)) flag=0;
		else
		{
			father[dfs(x)]=dfs(y);
		}
	}
	r[y]++;
}

int main()
{
	int casee=1;
	while(cin>>a>>b)
	{
		ready();
		flag=1;
		if(a<0&&b<0){break;}
		if(!a&&!b) {cout<<"Case "<<casee++<<" is a tree."<<endl;continue;}
		build(a,b);sign[a]=sign[b]=1;
		while(cin>>a>>b&&a&&b)
		{
			build(a,b);
			sign[a]=sign[b]=1;
		}
		int k=0,d=0;
		for(int i=1;i<maxn;i++)
		{
			if(sign[i]&&dfs(i)==i) k++;
			if(sign[i]&&r[i]==0) d++;
		}
		if(k==1&&flag&&d==1) cout<<"Case "<<casee++<<" is a tree."<<endl;
		else  cout<<"Case "<<casee++<<" is not a tree."<<endl;
	}
	return 0;
} 
时间: 2024-10-19 03:48:49

hdu 1325 Is It A Tree?的相关文章

HDU 1325 Is It A Tree? (POJ 1308)

并查集问题... 这题以前做过-- 以前做过-- 做过-- 过-- 不过重做时候被吭得异常之爽-- 在判断 vis[i]的时候.我记得标准C++是非0 即为真. 而我用C++ 提交的时候 if(vis[i]) 去直接给我WA了. 用G++ 就AC了...然后改成if(vis[i]==1) 交C++ 就AC了. 特瞄的我每次初始化都把 vis[i] 都赋值为 0 了..都能出这种错? 求路过大神明示我的错误. 题意是判断是否是一棵树. 不能存在森林,用并查集合并,每个点的入度不能超过1. 比如 1

HDU 1325 Is It A Tree? 并查集

判断是否为树 森林不是树 空树也是树 成环不是树 数据: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 0 0 1 2 2 3 4 5 0 0 2 5 0 0 ans: no no yes #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype

hdu 1325 Is It A Tree?(并查集)

题意:给出点.边,判断是不是一棵树 思路:问题是如何判断是不是树? 我总结了一下,但不官方,正确性待验证. 1.入度<=1(根节点为0,其他为1) 2.不能有环 3.只有一个根节点 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 50000 int fa[MAXN]; int a[MAXN]; int in[MAXN]; int se

【并查集】hdu 1325 Is It A Tree?

注意以下4种情况: 0 0              可以1 1 0 0       不可以 1 2 1 2 0 0 不可以1 2 2 1 0 0 不可以 1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN=100000+5; 5 6 int a,b,mycase=1; 7 bool ok=true; 8 int father[MAXN];//记录父节点 9 int temp[MAXN];//判断是否为森林(用并查

hdoj 1325 Is It A Tree? 【并查集】

做了一上午,终于ac了 wa了一次主要是忘了还有环!!! 主要是运用并查集知识,又复习了一次!! 思路:输入之后找能不能成环,成环就不是,其次还要判断是不是有两个父节点,如果有两个父节点也不是,之后就找相关的祖先就好了: 还要注意:如果只有一个节点,也是树,如果有两个或多个根节点也不是树:如果没有根节点也不是 链接http://acm.hdu.edu.cn/showproblem.php?pid=1325 代码 #include<stdio.h> int fat[1000]; int fath

HDU 1325 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1325 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26387    Accepted Submission(s): 6039 Problem Description A tree is a well-known data

(并查集)POJ 1308 &amp; HDU 1325

一开始以为两道题是一样的,POJ的过了直接用相同代码把HDU的交了,结果就悲剧了.最后发现HDU的没有考虑入度不能大于一. 题意:用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环.只有一个入度为0的结点,不存在入度大于1的结点. 思路:并查集. AC代码: #include<stdio.h> #include<string.h> #define N 100005 int in[N],pre[N],a,b,c[N]; void init()//初始化 { for(i

HDU 1325 有根树的判断

Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 33083 Accepted Submission(s): 7574 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1325 Problem Description A tree is a well-known data

hdu 4863 Centroid of a Tree 树dp

代码来自baka.. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<stack> #include<set> #include<cmath> #include<vecto