HDU 1879 继续畅通工程【最小生成树】
2017-08-14 08:50
477 查看
题目链接
题目意思
给你n个城镇,城镇序号从1~n,现在要使这n个城镇相连。每组数据给你两个城镇的编号,和修这条路的成本,还有这条路的状态,0表示没修,1表示修好。现在要你求让城镇相连的最小的修路花费。解题思路
其实这就是一个最小生成树的问题。我们找到一棵最小生成树。这里需要注意的是两个城镇之间可能路已经修好,那么我们就要有一个操作就是把已经存在道路的两个城镇之间的花费改为0。具体实现看代码吧!代码部分
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int MAX=15000; int n,m,i,sum,pre[MAX]; struct node { int from;///边的起点 int over;///边的终点 int weight;///边的权值 }Edge[MAX]; bool cmp(node a,node b) { return a.weight<b.weight; } int Find(int x) { if(pre[x]==x) return x; return pre[x]=Find(pre[x]); } int mix(int x,int y) { x=Find(x); y=Find(y); if(x<y) pre[x]=y; else pre[y]=x; } int kruskal() { sort(Edge,Edge+m,cmp); for(i=0; i<=n; i++) pre[i]=i; sum=0; for(i=0; i<m; i++) { if(Find(Edge[i].from)!=Find(Edge[i].over)) { mix(Edge[i].from,Edge[i].over); sum+=Edge[i].weight; } } return sum; } int main() { int a,b,c,d,ans; while(~scanf("%d",&n)) { if(n==0) break; m=n*(n-1)/2; for(int i=0; i<m; i++) { scanf("%d%d%d%d",&a,&b,&c,&d); Edge[i].from=a; Edge[i].over=b; if(d==0) Edge[i].weight=c; else Edge[i].weight=0; } ans=kruskal(); cout<<ans<<endl; } return 0; }
相关文章推荐
- HDU 1879 继续畅通工程(最小生成树)
- hdu 1879 继续畅通工程 (最小生成树)
- HDU 1879 继续畅通工程(最小生成树-Kruskal)
- HDU 1879 继续畅通工程 prim算法 最小生成树
- HDU 1879 继续畅通工程(Kruskal求最小生成树)
- 【HDU】-1879-继续畅通工程(最小生成树)
- hdu 1879 继续畅通工程 最小生成树
- hdu 1879 继续畅通工程 最小生成树kruskal
- HDU 1879 继续畅通工程 (最小生成树)
- HDU - 1879 [继续畅通工程] 最小生成树Kruskal
- hdu 1879 继续畅通工程(最小生成树,基础)
- HDU1879 继续畅通工程 【图论】【最小生成树】【Kruskal】
- HDU 1879 继续畅通工程(最小生成树)
- hdu 1879 继续畅通工程 最小生成树
- hdu 1879 继续畅通工程 最小生成树
- hdu1879 继续畅通工程 (最小生成树之prim 算法)
- Hdu 1879 继续畅通工程 最小生成树 解题报告
- HDU1879--继续畅通工程(最小生成树)
- HDU 1879--继续畅通工程【kruskal && 最小生成树 && 水题】
- MST(最小生成树)——Prim算法——HDU 1879-继续畅通工程