【并查集】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.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef long long LL;
const int maxn =10000+5;
const int maxe = 15000+5;
const int INF = 460002326;
const int mod = 1000000009;//q[i]表示点i 相应的点 rank[i]表示入度
int fa[maxn],q[maxn],rank[maxn],taj,flag;//taj表示当前点的编号个数
void init()
{
flag=0;
taj=1;
for(int i=0; i<maxn; i++)
fa[i]=i,q[i]=-1,rank[i]=0;
}
int find(int x)
{
if(fa[x]==x)
return x;
else
{
fa[x]=find(fa[x]);
return fa[x];
}
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy)
{
flag=1;//反复
return ;
}
else
{
fa[fy]=fx;
rank[y]++;//入度+1
return ;
}
}
void dian(int a,int b)
{
if(q[a]==-1)
q[a]=taj++;
if(q[b]==-1)
q[b]=taj++;
}
int main()
{
int a,b,cas=0;
// freopen("in.txt","r",stdin);
while(scanf("%d%d",&a,&b),a+b>=0)
{
init();//初始化
if(a==0&&b==0)// 0 0 也算树
{
printf("Case %d is a tree.\n",++cas);
continue;
}
a=q[a],b=q[b];
merge(a,b);
while(scanf("%d%d",&a,&b))
{
if(a+b==0) break;
dian(a,b);
a=q[a],b=q[b];
merge(a,b);
}
a=0;
for(int i=1; i<maxn; i++)
find(i);
for(int i=1; i<maxn; i++)
{
if(q[i]!=-1&&fa[q[i]]==q[i])//根节点
a++;
if(rank[i]>1)
flag=1;
}
printf("Case %d is ",++cas);
if(a==1&&flag==0&&taj>2)
puts("a tree.");
else puts("not a tree.");
}
return 0;
}
【并查集】HDU 1325 Is It A Tree?的更多相关文章
- Hdu.1325.Is It A Tree?(并查集)
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 1325 Is It A Tree? 并查集
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 简单并查集 -- HDU 1232 UVALA 3644 HDU 1856
并查集模板: #include<iostream> using namespace std; ],x,y; ]; //初始化 x 集合 void init(int n) { ; i< ...
- 集合问题 离线+并查集 HDU 3938
题目大意:给你n个点,m条边,q个询问,每条边有一个val,每次询问也询问一个val,定义:这样条件的两个点(u,v),使得u->v的的价值就是所有的通路中的的最长的边最短.问满足这样的点对有几 ...
- 带权并查集 HDU - 3047
题意: 一圈座位有n个,给出m组序号之间的关系,比如,1 2 150 代表2号坐在1号位置序号+150,看m组数据有多少组冲突的. 思路: 带权并查集模板. #include<stdio.h&g ...
- HDU 1325 Is It A Tree?(并查集)
题目大意: 给你两个节点,前者指向后者(可以认为前者是后者的父节点),然后让你判断是否是一棵树. 解题思路: 先说说这道题和小希的迷宫(HDU1272)那道题的区别,前者给出的两个点是有方向的,而后者 ...
- hdu 1325 Is It A Tree?
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdu 1325 Is It A Tree? (树、node = edge + 1、入度 <= 1、空树)
Is It A Tree?Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU1272 小希的迷宫 并查集
参考网址:http://blog.sina.com.cn/s/blog_6827ac4a0100nyjy.html 解题思路: 由于这里出现的数字不一定连续的数字都会出现,所以设一个mark来标记数字 ...
随机推荐
- java三大框架项目和Redis组合使用
已知一个已有的Struts+Spring+Hibernate项目,以前使用MySQL数据库,现在想把Redis也整合进去.1. 相关Jar文件 下载并导入以下3个Jar文件: commons-pool ...
- 学python+django去北京找工作,靠谱吗?
有些朋友说,自己的学习能力还可以.倾向于python加框架,如django,python本来就会一些.不太了解北京公司的情况,想知道现学的python+django在北京找到工作有多少可能性. 要想知 ...
- 6. ZooKeeper访问控制列表
ZooKeeper的数据模型提供了ACL机制来控制访问znode. 在创建znode时,ACL将确定你可以在znode上执行的各种操作的权限. ZooKeeper ACL模型与Unix / Linux ...
- NFS服务
第1章 NFS介绍 1.1 NFS的概念 NFS是Network File System的缩写,即网络文件系统,它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户 ...
- gulp 打包合并
1.安装node.js 下载地址: http://nodejs.cn/ 打开node.js 命令行,输入: node -v ,有版本号,则正确安装. 2.安装淘宝镜像 :命令行输入 : npm i ...
- 【机器学习】DNN训练中的问题与方法
感谢中国人民大学的胡鹤老师,人工智能课程讲的很有深度,与时俱进 由于深度神经网络(DNN)层数很多,每次训练都是逐层由后至前传递.传递项<1,梯度可能变得非常小趋于0,以此来训练网络几乎不会有什 ...
- ERP服务器简单维护
前言: 此页内容对于网管高手来说是小儿科,但是以我们对大多数企业的了解,依然有好多企业将服务器的日常维护给忽视了. 所以在此,给大家做一个宣传.让大家提高服务器维护的意识 以提高服务器运行的稳定性.安 ...
- Android 在通知栏实现计时功能
Notification是APP 向系统发出通知时,它将先以图标的形式显示在通知栏中.用户可以下拉通知栏查看通知的详细信息.我们可以在通知栏实现自定义的效果,也可以结合service和BroadCas ...
- C# Code First 实例学习
Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库.下面具体讲解一下,在操作的 ...
- Unity3D手机斗地主游戏开发实战(04)_出牌判断大小(已完结)
之前我们实现了叫地主.玩家和电脑自动出牌主要功能,但是还有个问题,出牌的时候,没有有效性检查和比较牌力大小.比如说,出牌3,4,5,目前是可以出牌的,然后下家可以出任何牌如3,6,9. 问题1:出牌检 ...