哈理工oj 1725 Virus Outbreaking 【并查集】

来源:互联网 发布:上虞干部教育培训网络 编辑:程序博客网 时间:2024/05/07 23:49
Virus OutbreakingTime Limit: 1000 MSMemory Limit: 32768 KTotal Submit: 122(37 users)Total Accepted: 45(34 users)Rating: Special Judge: NoDescription

Village H is suffering a virus outbreaking. 

There are n persons in the village, some of them is infected by at most one virus.


Input

There are multiple test cases. The first line is an integer T indicating the number of test cases.

The first line of each case is two positive integers n and q. n is the number of persons in the village and q is the times of event happened in village H.

The second line of each case is n numbers a1, a2, ..., an separated by space. ai stands for the kind of virus the ith person infected. 0 means not infected.

Then q lines following, each is an event happened in the village, consist of touching or query ordered by happening:

touch A B: a touched b and they infected each other. They will be together until the end.

query A: ask how many kind of virus person A infected. If A is not infected, output 0.

There will be a blank line after each case.


Note: 1 <= n <= 1000, 1 <= q <= 1000, 0 <= ai <= 32.


Output

For each query, output one line consist of all kinds of virus the person A infected, Output them  by the increasing order, separated by space.

Output a blank line after each test case.

Sample Input
24 620 14 24 30query 1query 4query 4query 4touch 1 4query 24 67 4 28 20touch 4 1query 2query 1query 3query 3query 1
Sample Output
2030303014
47 2028287 20
简单并查集,重点是输出,注意查重及方法;
#include<bits/stdc++.h>using namespace std;int pre[1111];int a[1111];int n, m;int findx(int x){    return pre[x] == x ? x : pre[x] = findx(pre[x]);}void join(int a, int b){    int X = findx(a);    int Y = findx(b);    if(X != Y)        pre[X] = Y;}void group(int c){    int ans[1111];    int num = 0;    for(int i = 1; i <= n; i++)    {        if(findx(i) == findx(c))        {            int flag = 1;      ///查重            for(int j = 0; j < num; j++)                if(ans[j] == a[i])                    flag = 0;            if(flag && a[i])                ans[num++] = a[i];        }    }    if(!num)        printf("0\n");    else    {        sort(ans, ans + num);        for(int i = 0; i < num - 1; i++)            printf("%d ", ans[i]);        printf("%d\n", ans[num - 1]);    }}int main(){    int t;    scanf("%d", &t);    while(t--)    {        scanf("%d%d", &n, &m);        for(int i = 1; i <= n; i++)        {            scanf("%d", &a[i]);            pre[i] = i;        }        while(m--)        {            char order[66];            scanf("%s", order);            if(order[0] == 't')            {                int nx, ny;                scanf("%d%d", &nx, &ny);                join(nx, ny);            }            if(order[0] == 'q')            {                int nz;                scanf("%d", &nz);                group(nz);            }        }        printf("\n");    }    return 0;}

阅读全文
0 0
原创粉丝点击