并查集练习3:HDOJ4496 WA

来源:互联网 发布:淘宝指定商品优惠券 编辑:程序博客网 时间:2024/06/06 05:05

考虑的问题是动态删除连接。

如果多次建并查集,时间复杂度太高了,考虑如何只建立一次。

或者也可以反向进行建立,然后存起来,再反向输出。但是这样也要存输入的数据。

所以尝试逆序进行。

结果不正确:

#include <iostream>#include <string.h>using namespace std;int findroot(int a) ;void unionroot(int a, int b) ;int city[10005] ;int weight[10005] ;int saveinput[100005][2], result[100005];int main(){    int N = 0,M = 0 ;    int roota,rootb ;    cin >> N >> M;    for(int i = 0; i< N ; i++)    {        city[i] = i ;        weight[i] = 1 ;    }    for(int i = 1 ; i <= M ; i++)        cin >> saveinput[i][0] >> saveinput[i][1] ;    result[M] = N ;    for(int i = M ; i > 0; i--)    {        roota = findroot(saveinput[i][0]) ;        rootb = findroot(saveinput[i][1]) ;        if(roota != rootb)        {            unionroot(roota, rootb) ;            result[i-1] = result[i] - 1 ;        }        else            result[i-1] = result[i];    }    for(int i = 1 ; i <= M ; i++)        cout << result[i] << endl ;    return 0;}int findroot(int a){    while(a!=city[a])    {        a = city[a] ;    }    return a ;}void unionroot(int a, int b){    if(weight[a]>weight[b])    {        city[b] = a ;        weight[a]+=weight[b] ;    }    else    {        city[a] = b ;        weight[b]+=weight[a] ;    }}


0 0
原创粉丝点击