1118. Birds in Forest (25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in the same picture belong to the same tree. You are supposed to help the scientists to count the maximum number of trees in the forest, and for any pair of birds, tell if they are on the same tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive number N (<= 104) which is the number of pictures. Then N lines follow, each describes a picture in the format:
K B1 B2 ... BK
where K is the number of birds in this picture, and Bi's are the indices of birds. It is guaranteed that the birds in all the pictures are numbered continuously from 1 to some number that is no more than 104.

After the pictures there is a positive number Q (<= 104) which is the number of queries. Then Q lines follow, each contains the indices of two birds.

Output Specification:

For each test case, first output in a line the maximum possible number of trees and the number of birds. Then for each query, print in a line "Yes" if the two birds belong to the same tree, or "No" if not.

Sample Input:

4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7

Sample Output:

2 10
Yes
No 思路 并查集的应用,
1.输入的时候将每只鸟合并到相关的集合中,并确定共同的源点鸟来代表这个集合,用一个bool数字birds标识一只鸟的存在。
2.集合数就是树的棵数,birds中为true值的变量总数就是鸟的数量
3.判断两只鸟是否在一棵树上其实就是判断它们的源点鸟是否一样就行。 代码
#include<iostream>
#include<vector>
using namespace std;
const int maxnum = 10002;
//并查集
vector<int> sources(maxnum); //某个点的源点
vector<int> cntnum(maxnum,0); //该源点点下的鸟个数
vector<bool> birds(maxnum,false); //标识鸟的存在 void Init() //初始化
{
for(int i = 1;i < maxnum;i++)
sources[i] = i;
} int findsource(int x)
{
int y = x; //索引
while( x != sources[x]) //找最初源点
{
x = sources[x];
} while( y != sources[y])
{
int tmp = y;
y = sources[y]; //继续找
sources[tmp] = x; //将所有相关点的源点统一
} return x;
} void Union(int x,int y) //合并两个相关集
{
int xsource = findsource(x);
int ysource = findsource(y);
if(xsource != ysource)
{
sources[xsource] = ysource; //合并
}
} int main()
{
int N;
Init();
while(cin >> N)
{
//输入
for(int i = 0;i < N;i++)
{
int K,first;
cin >> K >> first;
birds[first] = true;
for(int j = 0 ;j < K - 1;j++)
{
int tmp;
cin >> tmp;
birds[tmp] = true;
Union(first,tmp);
}
} //处理
int treenum = 0,birdsum = 0;
for(int i = 1;i < maxnum;i++)
{
if(birds[i])
++cntnum[sources[i]];
} for(int i = 1;i < maxnum;i++)
{
if(cntnum[i] != 0)
{
if(sources[i] == i)
treenum++;
birdsum += cntnum[i];
}
}
//输出多少棵树多少只鸟
cout << treenum << " " << birdsum << endl;
//查询
int Q;
cin >> Q;
for(int i = 0;i < Q;i++)
{
int a,b;
cin >> a >> b;
if(findsource(a) == findsource(b))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
}

  

PAT1118:Birds in Forest的更多相关文章

  1. PAT1118. Birds in Forest (并查集)

    思路:并查集一套带走. AC代码 #include <stdio.h> #include <string.h> #include <algorithm> using ...

  2. 1118 Birds in Forest (25 分)

    1118 Birds in Forest (25 分) Some scientists took pictures of thousands of birds in a forest. Assume ...

  3. [并查集] 1118. Birds in Forest (25)

    1118. Birds in Forest (25) Some scientists took pictures of thousands of birds in a forest. Assume t ...

  4. PAT 1118 Birds in Forest [一般]

    1118 Birds in Forest (25 分) Some scientists took pictures of thousands of birds in a forest. Assume ...

  5. PAT甲级——1118 Birds in Forest (并查集)

    此文章 同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/89819984   1118 Birds in Forest  ...

  6. PAT_A1118#Birds in Forest

    Source: PAT A1118 Birds in Forest (25 分) Description: Some scientists took pictures of thousands of ...

  7. A1118. Birds in Forest

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  8. PAT A1118 Birds in Forest (25 分)——并查集

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  9. 1118 Birds in Forest (25 分)

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

随机推荐

  1. How to SetUp The Receiving Transaction Manager

    In this Document   Goal   Solution   References APPLIES TO: Oracle Inventory Management - Version: 1 ...

  2. 再回首UML之上篇

    UML,统一建模语言,是一种用来对真实世界物体进行建模的标准标记,这个建模的过程是开发面向对象设计方法的第一步,UML不是一种方法学,不需要任何正式的工作产品. UML提供多种类型的模型描述图,当在某 ...

  3. 华为机试题【10】-求数字基root

    题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一 ...

  4. eclipse搭建ssh后台

    SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程.  第一步:准备工作.    下载好eclipse,Struts2,Spring, ...

  5. 在多台PC上进行ROS通讯-学习笔记

    首先,致谢易科(ExBot)和ROSWiki中文社区. 重要参考文献: Running ROS across multiple machines http://wiki.ros.org/ROS/Tut ...

  6. mysql 好文章

    http://my.oschina.net/OpenSourceBO/blog/353464 http://www.oschina.net/p/cobar mysql集群 http://www.dew ...

  7. zookeeper+kafka集群安装之二

    zookeeper+kafka集群安装之二 此为上一篇文章的续篇, kafka安装需要依赖zookeeper, 本文与上一篇文章都是真正分布式安装配置, 可以直接用于生产环境. zookeeper安装 ...

  8. PS图层混合算法之二(线性加深,线性减淡,变亮,变暗)

    线性加深模式: 查看每个通道的颜色信息,通过降低"亮度"使底色的颜色变暗来反映绘图色,和白色混合没变化. Linear Burn 线形加深 C=A+B-1 如果上下层的像素值之和小 ...

  9. Struts2(XWork)中的Container 一

    本文是<<struts2 技术内幕>>的学习笔记 在进行面向对象编程的时候,我们不可避免地要使用继承实现等等java提供的语法支持.但是复杂的对象关系也为对象生命周期的管理带来 ...

  10. How Tomcat Works读书笔记三-------连接器

    几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是htt ...