并查集入门--知识点 畅通工程

来源:互联网 发布:合肥市行知学校在哪 编辑:程序博客网 时间:2024/06/06 05:28

2.并查集算法以及路径压缩

int pre[1000 ];int find(intx)                                                                                                      //查找根节点{    int r=x;   while ( pre[r ] != r)                                                                                             //返回根节点 r          r=pre[r];    int i=x , j ;   while( i != r)                                                                                                      //路径压缩   {        j = pre[ i ]; // 在改变上级之前用临时变量  j 记录下他的值         pr   }   return r ;}

将两点相连

void join(intx,inty)                                                                                                    //判断x y是否连通,                                                                                            //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起,{   int fx=find(x),fy=find(y);   if(fx!=fy)       pre[fx ]=fy;//接通需要通过两个父节点进行连接  pre【fx】=fy; 意思是fx的父节点为fy}


代码:

//本程序的本质就是查询存在的连接数  通过总数减去存在的 得到的就是需要增加的最小连接数

#include<iostream>using namespace std;int n,m,a,b;int sum,pre[10000]; int find(int x){intr;r=x;while(pre[r]!=r){r=pre[r];}inti=x,j;while(i!=r){j=pre[i];//¼Ç¼ֵpre[i]=r;i=j;}returnr;} void join(int x,inty){intfx=find(x),fy=find(y);if(fx!=fy){pre[fx]=fy;sum--;}}int main(){while(cin>>n&&n){cin>>m;sum=n-1;for(inti=1;i<=n;i++)//³õʼ»¯Á¬½Óµãpre[i]=i;for(inti=1;i<=m;i++){cin>>a>>b;join(a,b);}cout<<sum<<endl;}return0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做俯卧撑胸肌疼怎么办 健身完肌肉酸痛怎么办 不小心杀生了怎么办 名字取得太大了怎么办 麻将馆没客人怎么办 顺丰快递着急怎么办 孕妇吃菠萝过敏怎么办 燕窝炖稀了怎么办 玻尿酸隆鼻变宽怎么办? 三无燕窝被打假 怎么办 喜用神为土应该怎么办 喜用神互相克害怎么办? 姓名总格不好怎么办 姓名学里人格不好怎么办 买家订单下不了怎么办 公积金不够月供怎么办 房贷担保费没交怎么办 营业执照过期1年怎么办 营业执照和公章丢失怎么办 个体户怎么办对公账户 公章法人章丢失怎么办 广州买房没有社保怎么办 辞职后计生关系怎么办 广州换工作社保怎么办 学校更名了盖章怎么办 工商注册资金没有交怎么办 住公司宿舍怎么办居住证 住在公司宿舍怎么办居住证 滴滴没有的车型怎么办 假的租房合同怎么办 代注册公司被骗怎么办 公司跨区迁址怎么办 公司搬走注册地怎么办 注册公司没有房产证怎么办 公司不运营了怎么办 公司注销了账户怎么办 租户不变更地址怎么办 营业执照忘审了怎么办 工商营业执照年检过期怎么办 个体营业执照没有年报怎么办? 个体工商户一年没有申报怎么办