九度 1024 通畅工程

xiaoxiao2021-02-28  122

题目描述: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。 输入: 测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。 输出: 对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。 样例输入: 3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100 样例输出: 3 ?

http://ac.jobdu.com/problem.php?pid=1024 并查集+贪心

#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; #define MAXN 105 typedef struct Edge{ int start; int end; int weight; } Edge ; Edge edge[MAXN]; int father[MAXN]; int n, m ; int findParent (int t){ return father[t] == t ? t : father[t] = findParent(father[t]); } int Union(int x, int y){ int xParent = findParent(x); int yParent = findParent(y); if (xParent == yParent) return 0; xParent > yParent ? father[xParent] = yParent : father[yParent] = xParent; return 1; } int compare (const void * p, const void * q){ Edge * p1 = (Edge *)p; Edge * q1 = (Edge *)q; return p1->weight - q1->weight; } void setInit(){ for (int i = 1; i <= m; ++ i){ father[i] = i; } } int solution(){ int used = 0 ,re = 0; for(int i = 0;i < n - 1;i++){ if(used == m -1 )break; if (Union(edge[i].start, edge[i].end)){ used++; re += edge[i].weight; } } return used != m - 1? 0 : re; } int main() { //freopen("in.txt","r",stdin); while(cin >> n >> m){ if(n == 0)break; for(int f = 0; f < n; f ++) cin >> edge[f].start >> edge[f].end >> edge[f].weight; qsort(edge, n, sizeof(Edge), compare); setInit(); int re = solution() ; re ?cout << re <<endl : cout << '?' <<endl; } return 0; }
转载请注明原文地址: https://www.6miu.com/read-40101.html

最新回复(0)