hdu 1232畅通工程 并查集(入门题)
2014-03-01 19:50
225 查看
并查集水题。。先来点并查集基础。。查找函数:
int find(int i)
{
int t=i;
while(bin[t]!=t)
t=bin[t];
return t;
} 没有路径压缩
int find(int i)
{
int k,t;
t=i;
while(t!=bin[t])
t=bin[t];
while(i!=t) //修改路径---压缩
{
k=bin[i];
bin[i]=t;
i=k;
}
return i;
} 带有路径压缩
还有一个递归路径压缩查找:
int find(int x)
{
return father[x]-x ? father[x]=find(father[x]) : x;
}
分析:把已连通的公路通过并查集算法合并到一个集合。。然后通过查找有多少个不同的集合就能知道还有多少条路需要建设。。
本题代码:
int find(int i)
{
int t=i;
while(bin[t]!=t)
t=bin[t];
return t;
} 没有路径压缩
int find(int i)
{
int k,t;
t=i;
while(t!=bin[t])
t=bin[t];
while(i!=t) //修改路径---压缩
{
k=bin[i];
bin[i]=t;
i=k;
}
return i;
} 带有路径压缩
还有一个递归路径压缩查找:
int find(int x)
{
return father[x]-x ? father[x]=find(father[x]) : x;
}
分析:把已连通的公路通过并查集算法合并到一个集合。。然后通过查找有多少个不同的集合就能知道还有多少条路需要建设。。
本题代码:
#include<iostream> using namespace std; int father[1001]; int find(int x) { return father[x]-x ? father[x]=find(father[x]) : x; } void unio(int x, int y) { if(find(x)-find(y)) father[find(x)]=find(y); } int main() { int n, m, i, x, y, sum; while(scanf("%d",&n) && n) { for(i=1; i<=n; i++) { father[i]=i; } scanf("%d",&m); for(i=1; i<=m; i++) { scanf("%d%d",&x,&y); unio(x, y); } for(sum=-1,i=1; i<=n; i++) { if(father[i]==i) sum++; } cout<<sum<<endl; } return 0; }
相关文章推荐
- 并查集 入门-HDU 1232
- hdu 1232畅通工程 并查集
- HDU-1232/NYOJ-608畅通工程,并查集模板题,,水过~~~
- HDU 1232 解题报告 并查集入门
- hdu 1232 并查集入门
- 【并查集入门】HDU1232——畅通工程
- 畅通工程(并查集) 【HDU】-1232
- HDU 1232 畅通工程(并查集)
- HDU 1232 并查集 (入门)
- HDU1232 畅通工程 并查集入门
- hdu 1232 畅通工程【并查集入门】
- HDU 1232畅通工程(并查集经典应用)
- hdu 1232 畅通工程(入门之并查集)
- hdu 1232 畅通工程【并查集入门】
- HDU 1232 畅通工程 入门并查集 附大牛讲解 4000
- hdu-1232-畅通工程(并查集入门题)
- HDOJ---1232 畅通工程[并查集]
- HDU 1213 How Many Tables(并查集入门模板题)
- HDU 1232 畅通工程 (并查集)
- HDU 1232畅通工程