HDU 1232 畅通工程 (并查集解法)

来源:互联网 发布:如何申请淘宝号 编辑:程序博客网 时间:2024/05/17 02:14

1.这道题可以用并查集来做。

2.题目的大意是:给你一个N,表示有多少个点,这些点从1到N标记;再给你一个M,表示连接这些点的线数,后面有M行,表示哪些点之间是相通的。
问你有多少个不同的祖先数(注意最后要减去一,因为一个祖先就不用画线,两个祖先就画一条线……N个祖先画N-1条线)
3.并查集的find函数用了压缩路径的非递归形式,不过应该也可以不用路径压缩,毕竟数不大(N是小于1000的)

#include <bits/stdc++.h>using namespace std;const int MAXN=1010;int pre[MAXN];int N,M;int cnt;int found(int x){    int k,j,r;    r=x;    while(r!=pre[r])   //找祖先    {        r=pre[r];    }    k=x;    while(k!=r)           // 非递归压缩路径    {        j=pre[k];        pre[k]=r;        k=j;    }    return r;}void join(int x,int y)     // 将道路连接起来{    int fx=found(x);    int fy=found(y);    if(fx!=fy)    {        pre[fx]=fy;        --cnt;    }}int main(){    while(cin>>N&&N)    {        cnt=N-1; //把这些点最初看成非连接的,那么就有N个独立的点,那么连接这些点最少需要N-1条线        cin>>M;        for(int i=1;i<=N;i++)            pre[i]=i;        for(int i=1;i<=M;i++)        {            int x,y;            cin>>x>>y;            join(x,y);        }        cout<<cnt<<endl;    }}

没什么要注意的了……就这么多 其实可以用连同块来写,等我写出来了再发表出来

原创粉丝点击