首页 > 代码库 > 并查集
并查集
1. HDU 1232(并查集模板题)
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 #define MAX 1002 6 int pre[MAX];///用来标记关系 7 int t[MAX];///用来标记独立的快 8 int find(int x)///查找根节点 //查找根节点 9 { 10 int r=x; 11 while(pre[r]!=r) //返回根节点 r 12 r=pre[r]; 13 int i=x,j; 14 while(i!=r) //路径压缩 15 { 16 j=pre[i]; // 在改变上级之前用临时变量 j 记录下他的值 17 pre[i]=r ; //把上级改为根节点 18 i=j; 19 } 20 return r; 21 } 22 23 void join(int x,int y)//判断x y是否连通, 24 //如果已经连通,就不用管了 //如果不连通,就把它们所在的连通分支合并起, 25 { 26 int fx=find(x),fy=find(y); 27 if(fx!=fy) 28 pre[fx]=fy; 29 } 30 int main() 31 { 32 int n,m,from,to,ans,i; 33 while(scanf("%d%d",&n,&m)!=EOF&&n) 34 { 35 for(int i=1; i<=n; i++)//初始化 36 pre[i]=i; 37 for(int i=1; i<=m; i++) 38 { 39 scanf("%d%d",&from,&to); 40 join(from,to); 41 } 42 memset(t,0,sizeof(t)); 43 for(int i=1; i<=n; i++) 44 t[find(i)]=1;///标记根节点 45 for(ans=0,i=1; i<=n; i++) 46 if(t[i]) 47 ans++; 48 printf("%d\n",ans-1); 49 } 50 return 0; 51 }
并查集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。