SDUT 2144
Posted coder-tcm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUT 2144相关的知识,希望对你有一定的参考价值。
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。
运行错误一次,数组大小应取决于边的数量。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define Maxn 10010 using namespace std; struct edge { int start,endn,weight; } edges[Maxn]; char parent[Maxn]; int n,m; int cmp(struct edge a,struct edge b) { return a.weight<b.weight; } int Find(int x) { int r,temp; for(r=x; parent[r]>=0; r=parent[r]); while(r!=x) { temp=x; x=parent[x]; parent[temp]=r; } return r; } void merge(int A,int B) { int a=Find(A),b=Find(B); int temp=parent[a]+parent[b]; if(parent[a]>parent[b]) { parent[a]=b; parent[b]=temp; } else { parent[b]=a; parent[a]=temp; } } void kruskal() { int sumweight=0,d=0; for(int i=0; i<m;i++) { if(Find(edges[i].start)!=Find(edges[i].endn)) { d++; sumweight+=edges[i].weight; merge(edges[i].start,edges[i].endn); } } if(d==n-1) printf("%d ",sumweight); else printf("ERROR "); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(parent,-1,sizeof(parent)); for(int i=0; i<m; i++) scanf("%d%d%d",&edges[i].start,&edges[i].endn,&edges[i].weight); sort(edges,edges+m,cmp); kruskal(); } return 0; }
以上是关于SDUT 2144的主要内容,如果未能解决你的问题,请参考以下文章