04-2. File Transfer (25)并查集

04-2. File Transfer (25)

时间限制

150 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other?

Input Specification:

Each input file contains one test case. For each test case, the first line contains N (2<=N<=104), the total number of computers in a network. Each computer in the network is then represented by a positive integer between 1
and N. Then in the following lines, the input is given in the format:

I c1 c2

where I stands for inputting a connection between c1 and c2; or

C c1 c2

where C stands for checking if it is possible to transfer files between c1 and c2; or

S

where S stands for stopping this case.

Output Specification:

For each C case, print in one line the word "yes" or "no" if it is possible or impossible to transfer files between c1 and c2, respectively. At the end of each case, print in one line "The network is connected."
if there is a path between any pair of computers; or "There are k components." where k is the number of connected components in this network.

Sample Input 1:

5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
S

Sample Output 1:

no
no
yes
There are 2 components.

Sample Input 2:

5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
I 1 3
C 1 5
S

Sample Output 2:

no
no
yes
yes
The network is connected.


提交代

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define lson rt<<1,l,MID
#define rson rt<<1|1,MID+1,r
//#define lson root<<1
//#define rson root<<1|1
#define MID ((l+r)>>1)
typedef long long ll;
typedef pair<int,int> P;
const int maxn=50005;
const int base=1000;
const int inf=999999;
const double eps=1e-5;
int a[maxn];//表示集合的树
int r[maxn];//表示树的高度
void build(int n)//初始化
{
    for(int i=0;i<=n;i++)
    {
        a[i]=i;//父亲就是自己
        r[i]=0;//高度为0
    }
}  

int find(int x)//查找节点的父亲
{
    if(a[x]==x)
        return x;
    return a[x]=find(a[x]);
}  

void add(int x,int y)//节点的合并
{
    x=find(a[x]);
    y=find(a[y]);
    if(x==y)
        return;
    else if(r[x]<r[y])
        a[x]=y;
    else
    {
        a[y]=x;
        if(r[x]==r[y])r[x]++;
    }
}  

bool same(int x,int y)//判断是不是一个集合
{
    return find(x)==find(y);
}  

int main()
{
    int n,m,i,j,k,t;
    cin>>n;
    build(n);
    while(1)
    {
        char op[2];
        cin>>op;
        if(op[0]=='I')
        {
            cin>>i>>j;
            add(i,j);
        }
        else if(op[0]=='C')
        {
            cin>>i>>j;
            if(same(i,j))
                puts("yes");
            else
                puts("no");
        }
        else if(op[0]=='S')
        {
            int cnt=0;
            for(i=1;i<=n;i++)
                if(i==a[i])cnt++;
            if(cnt<=1)
                puts("The network is connected.");
            else
                printf("There are %d components.\n",cnt);
            break;
        }
    }
    return 0;
}  
时间: 2024-10-19 22:55:13

04-2. File Transfer (25)并查集的相关文章

PTA 5-8(English) File Transfer (25) - 并查集 - 数组实现

题目:http://pta.patest.cn/pta/test/16/exam/4/question/670 PTA - Data Structures and Algorithms (English) - 5-8 We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer t

pat04-树5. File Transfer (25)

04-树5. File Transfer (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it

04-树5. File Transfer (25)

04-树5. File Transfer (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it

1021. Deepest Root (25) 并查集&amp;&amp;DFS

1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph which is connected and acyclic can be considered a tree. The height of the tree depends on the selected root. Now you are supposed to find the root t

PAT 5-8 File Transfer (25分)

We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other? Input Specification:

05-树8 File Transfer (25分)

题目描述 We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any other? Input Specificat

File Transfer (25)

这是一道考察“并查集”的题目 并查集只有并和查这两种操作 值得注意的是,因为查的操作是O(height)的,所以我们可以依靠一些小技巧降低树的高度,并且不增加时间复杂度 #include <iostream> using namespace std; bool check(int x, int y); void connect(int x, int y); int father(int x); int *a; int main() { int n; cin >> n; a = (i

04-树5. File Transfer--并查集

对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一棵树来表示,而多个集合便是森林.并查集中的“并”是将两个集合合并即两棵树合并成一颗树:“查”是查找一个元素属于哪个集合,即查找一个节点属于哪棵树.思路如下: 查:通过节点找寻父节点,一直向上查找直到根节点,返回根节点,而根节点代表唯一的那棵树: 并:先查找到两个节点所在的树,如果在同一棵树中(即查找

05-树8 File Transfer (25 分)

05-树8 File Transfer (25 分) We have a network of computers and a list of bi-directional connections. Each of these connections allows a file transfer from one computer to another. Is it possible to send a file from any computer on the network to any o