hdu 4496 并查集 反向并查集 水题 D-City

觉得这道题以后可以和优先队列结合起来 嗯

就是说依次去掉前n条路求连通块数量

处理的时候  只要每次merge发现父亲不相等 然后进到里面合并的时候 num--

wa了好几次是因为最后输出的时候开了点的数量大小的数组而不是操作数量数组 orz

D-City

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 5334    Accepted Submission(s): 1864

Problem Description

Luxer is a really bad guy. He destroys everything he met.
One
day Luxer went to D-city. D-city has N D-points and M
D-lines. Each D-line connects exactly two D-points. Luxer will destroy
all the D-lines. The mayor of D-city wants to know how many connected
blocks of D-city left after Luxer destroying the first K D-lines in the
input.
Two points are in the same connected blocks if and only if they connect to each other directly or indirectly.

Input

First line of the input contains two integers N and M.
Then following M lines each containing 2 space-separated integers u and v, which denotes an D-line.
Constraints:
0 < N <= 10000
0 < M <= 100000
0 <= u, v < N.

Output

Output M lines, the ith line is the answer after deleting the first i edges in the input.

Sample Input

5 10
0 1
1 2
1 3
1 4
0 2
2 3
0 4
0 3
3 4
2 4

Sample Output

1
1
1
2
2
2
2
3
4
5

Hint

The graph given in sample input is a complete graph, that each pair of vertex has an edge connecting them, so there‘s only 1 connected block at first.
The first 3 lines of output are 1s because after deleting the first 3 edges of the graph, all vertexes still connected together.
But after deleting the first 4 edges of the graph, vertex 1 will be disconnected with other vertex, and it became an independent connected block.
Continue deleting edges the disconnected blocks increased and finally it will became the number of vertex, so the last output should always be N.

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>

using namespace std; 

const int MAXN = 10000;
const int MAXM = 100000;
int father[MAXN + 100];
int u[MAXM + 100];
int v[MAXM + 100];
int ans[MAXM + 100];
int n,m,num;

void initt(){
    for(int i = 0;i < n;i++){
        father[i] = i;
    }
    return;
}

int findd(int u){
    if(father[u] == u)
        return father[u];

    father[u] = findd(father[u]);
    return father[u];
}
void mergee(int u,int v){
    int fatu = findd(u);
    int fatv = findd(v);
    if(fatu != fatv){
        num--;
        father[fatu] = fatv;
    }
}

int main(){
    while(~scanf("%d%d",&n,&m)){
        //initt();
        for(int i = 0;i < n;i++){
            father[i] = i;
        }
        for(int i = 0;i < m;i++){
            scanf("%d%d",u+i,v+i);
        }

        num = n;
        for(int i = m-1;i >= 1;i--){
            mergee(u[i],v[i]);
            ans[i] = num;
        }
        ans[m] = n;
        for(int i = 1;i <= m;i++){
            printf("%d\n",ans[i]);
        }
    }

    return 0;
}

原文地址:https://www.cnblogs.com/xuyanqd/p/9028854.html

时间: 2024-08-02 03:44:59

hdu 4496 并查集 反向并查集 水题 D-City的相关文章

hdu 4496 D-City (逆向思维的并查集)

D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 1388    Accepted Submission(s): 520 Problem Description Luxer is a really bad guy. He destroys everything he met. One day Luxer went to D-c

HDU 4006 The kth great number (基本算法-水题)

The kth great number Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too mu

HDU - 4788 Hard Disk Drive (成都邀请赛H 水题)

HDU - 4788 Hard Disk Drive Time Limit:1000MS   Memory Limit:32768KB   64bit IO Format:%I64d & %I64u [Submit]  [Go Back]  [Status] Description Yesterday your dear cousin Coach Pang gave you a new 100MB hard disk drive (HDD) as a gift because you will

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

正则表达式之正向预查和反向预查

正向预查:1. 正向正预查:(?=)例如:foo(?=bar)        //匹配后面带有bar的foo它可以匹配: foobar, abcfoobar  中的foo但是不能匹配:fooabc 中的foo 2. 正向负预查:(?!) 例如: foo(?!bar)        //匹配后面不带bar的foo 它可以匹配: foo123 但是不能匹配:foobar 负向预查 1. 负向正预查(?<=) 例如: (?<=foo)bar        //匹配前面有foo的bar 它可以匹配:

hdu 1465(不容易系列之一)(水题,错排公式)(a[n]=(n-1)*(a[n-1]+a[n-2]))

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 14924    Accepted Submission(s): 6207 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好"一件"事情尚且不易,若想永远成功而总从不失败,那更是难上加难了,就像花钱总

hdu 5038 (2014北京网络赛G 排序水题)

题意:有n个数字,带入10000 - (100 - ai) ^ 2公式得到n个数,输出n个数中频率最大的数,如果有并列就按值从小到大都输出输出,如果频率相同的数字是全部的n个数,就输出Bad....题解:统计数字个数和频率,排序后输出. Sample Input36100 100 100 99 98 1016100 100 100 99 99 1016100 100 98 99 99 97 Sample OutputCase #1:10000Case #2:Bad MushroomCase #3

HDU ACM 5214 Movie -&gt;贪心+自然溢出取模-&gt;水题里的学问

分析:贪心,首先找到最右边的第一个左边界和最左边的第一个右边界.之后在判断是否有一个及一个以上的区间在这两个值之间,若有则能找到符合题意的三个区间,否则不能. 注意:这里利用的unsigned int的自然溢出决解了取模问题:第二个是一定生成完数据后在交换Li和Ri的值,这里被坑残了. #include<iostream> using namespace std; //__int64 mod=4294967296;由于4294967296-1刚好是unsigned int类型的最大值,对它取模

hdu 1849 Rabbit and Grass 谁都喜欢刷水题。。尼姆博弈

Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2507    Accepted Submission(s): 1888 Problem Description 大学时光是浪漫的,女生是浪漫的,圣诞更是浪漫的,但是Rabbit和Grass这两个大学女生在今年的圣诞节却表现得一点都不浪漫:不去逛商场,不去