NYOJ-129 并查集
这个题基本上是并查集稍微一变, 只是加了一些判断条件而已,就是将点合并成树, 最后遍历一下, 统计一下有多少棵树, 如果不是1的话, 肯定不是树,所以,可以根据这个来判断
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int MAX = ;
int f[MAX], IN[MAX], k = , sum = ;//IN表示节点的入度
bool visit[MAX];/*标记数组中的点是否存在, 就是是否是图中的点,
只要是输入的点, 其visit全部为true*/
bool flag;//标记是否是树
//初始化
void init()
{
for(int i = ; i < MAX; i++)
f[i] = i;
}
//找到它的父亲
int getf(int i)
{
if(i != f[i])
{
f[i] = getf(f[i]);//路径压缩
}
return f[i];
}
//合并函数,
void merge(int i, int j)
{
int t1 = getf(i);
int t2 = getf(j);
if(t1 != t2)
{
f[t2] = t1;
}
else
flag = false;//如果输入的点已经存在
} int main()
{
int x, y;
flag = true;
int max_num = ;
memset(f, , sizeof(f));
memset(IN, , sizeof(IN));
memset(visit, false, sizeof(visit));
init();
while(scanf("%d %d", &x, &y))
{
if(x == - && y == -)
break;
if(x == && y == )
{
sum = ;
for(int i = ; i <= max_num; i++)
{
if(visit[i] && i == f[i])//如果是根节点, 也就是树的个数
sum++;
}
for(int i = ; i <= max_num; i++)
if(visit[i] && IN[i] > )//如果一个节点的入度大于1
flag = false;
if(sum > )
flag = false;
if(flag)
printf("Case %d is a tree.\n", ++k);
else
printf("Case %d is not a tree.\n", ++k);
memset(f, , sizeof(f));
memset(visit, false, sizeof(visit));
memset(IN, , sizeof(IN));
flag = true;
init();
}
else
{
if(!flag)
continue;
max_num = max(max_num, max(x, y));
visit[x] = true;//标记此点在图中
visit[y] = true;
IN[y]++;//将第二个点的入度加一
merge(x, y);
}
}
return ;
}
NYOJ-129 并查集的更多相关文章
- NYOJ 129 树的判定 (并查集)
题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...
- Nyoj 布线问题(并查集&&图论)
描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有的楼都供上电.2.所用电线花费最少 输入 第一行是一个整数n表示有n组测试数据.(n ...
- nyoj 1022 合纵连横 经典并查集
思路:关键在于并查集的删点操作. 给每个诸侯国一个另外的编号,比如box[i]表示诸侯国i现在处于第box[i]个联盟,可以随时改变它的联盟编号,并且让box[i] = k, 实现删除操作.以前联盟中 ...
- NYOJ 208 Supermarket (模拟+并查集)
题目链接 描述 A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Pr ...
- NYOJ 1022 合纵连横 (并查集)
题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...
- NYOJ 42 一笔画问题 (并查集+欧拉回路 )
题目链接 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数 ...
- nyoj 711 枚举+并查集
#include<stdio.h>//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断 #include<stdlib.h>//枚举最大的一条边肯定 ...
- poj 1182 食物链 && nyoj 207(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52414 Accepted: 15346 Description ...
- nyoj 209 + poj 2492 A Bug's Life (并查集)
A Bug's Life 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Background Professor Hopper is researching th ...
- nyoj 1022 合纵连横 (并查集<节点删除>)
合纵连横 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法 ...
随机推荐
- 4位bcd数转换为2进制数
DATA SEGMENTBUF DW 1234HBUF1 DW ? ;2进制数放到buf1内存单元DATA ENDSCODE SEGMENTASSUME CS:CODE ...
- Linux下python3与python3的多版本共存
python3已经出来有些许时候了,python3相比python2进行了大量的改进,包括语法,新的功能,还有优化.虽然很多库已经同时支持 python2和python3了,但是有些库仍然没有很好的支 ...
- JavaScript设计模式之工厂模式
一.工厂模式概念 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子类可以重写接口方法以便创建的时候指定自己的对象类型(抽象工厂). 这个模 ...
- php错误级别设置
在php.ini中可以设置服务器对错误的报警级别.在默认情况下,php将报告除了通知之外的所有错误. 错误报告级别是通过一些预定义的常量来设置的, 语法 int error_reporting ( [ ...
- python使用PIL压缩图片
import Image import os import os.path import sys path = sys.argv[1] small_path = (path[:-1] if path[ ...
- Serilog with Autofac
http://serilog.net/ ---不错的日志工具 1.直接绑定 builder.Register<ILogger>((c, p) => { return new Log ...
- 资料Link集合
Spark RDD API详解(一) Map和Reduce| scala中Iterator的比较| 使用sbt构建scala应用| sbt常用命令| sbt更改默认ivy仓库位置| linux手动安 ...
- git的使用说明详解
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c7 ...
- Coupons
uva10288:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...
- Tag标签系统设计
转一篇关于tag的文章: <Tagging: People-powered Metadata for the Social Web>出版于2008年,中文版译为<标签:标记系统设计 ...