【用结构体数组完成最小生成树+并查集】
来源:互联网 发布:淘宝自动回复怎么修改 编辑:程序博客网 时间:2024/06/06 20:37
#include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef struct Line { int u; int v; int w; }; const int MAXN=110; int arr[MAXN]; Line lines[MAXN*MAXN/2]; int q,ans; bool cmp(Line a,Line b) { return a.w<b.w; } int find_father(int x) { return x==arr[x]?x:arr[x]=find_father(arr[x]); } void mer(int a,int b) { int fa=find_father(a); int fb=find_father(b); if(fa!=fb) arr[fa]=fb; } void reset() { int i; memset(lines,0,sizeof(lines)); q=0;ans=0; for(i=0;i<MAXN;i++) arr[i]=i; } int main() { //freopen("hdu1879.txt","r",stdin); int n,i,from,to,weigh,exist; while(scanf("%d",&n),n) { reset(); int nn=n*(n-1)/2; while(nn--) { scanf("%d%d%d%d",&from,&to,&weigh,&exist); if(exist) { mer(from,to); } else { lines[q].u=from; lines[q].v=to; lines[q++].w=weigh; } } sort(lines,lines+q,cmp); for(i=0;i<q;i++) { int fu=find_father(lines[i].u); int fv=find_father(lines[i].v); if(fv!=fu) { arr[fv]=fu; ans+=lines[i].w; } } printf("%d\n",ans); } }
转自:http://blog.csdn.net/cryssdut/article/details/18826679
以下为个人理解:
并查集做了一个划分,提供一个搜查手段(是否已有路),如果无路,那么从所有的可选的路里找一个最小的(事先将结构体用sort排序)。
0 0
- 【用结构体数组完成最小生成树+并查集】
- 并查集与最小生成树
- 并查集模版&最小生成树
- 最小生成树kruscal+并查集
- 并查集+最小生成树_HDU_1102
- bzoj1050(最小生成树 并查集)
- 最小生成树与并查集
- 最小生成树与并查集
- 最小生成树+并查集+ kruskal
- 并查集 最小生成树
- 最小生成树(并查集)
- 最小生成树+并查集模板
- 最小生成树&并查集练习
- 并查集/最小生成树
- 并查集 +最小生成树
- 最小生成树模板 并查集
- 最小生成树(并查集)
- 1.1 并查集 & 最小生成树
- 第三天(2) yum仓库搭建
- CocoaPods安装和使用教程
- 云盘+Git GUI实现云盘文件版本控制
- android状态机statemachine详解
- freemarker 空值判断
- 【用结构体数组完成最小生成树+并查集】
- 正向代理与反向代理的区别【Nginx读书笔记】
- 数据结构 图
- iOS new与alloc/init介绍
- [c.y.j]tomcat 性能优化
- Eclipse快捷键 10个最有用的快捷键
- JAVA CMD 编译java文件,在需要引入Jar包时,javac和java命令
- 善恶的本质
- Effective C++ NVI手法