题目连接:
http://poj.org/problem?id=1251
题目大意:
Lagrishan岛屿上的首领遇到一个问题。几年前外国援助的钱花在了修建两个村庄的道路上了,但是道路的毁坏是需要维修的,因此 村长必须放弃一些道路的维护。因此减少一些道路, 即使这些道路没有以前那么短了。长老们在讨论如何才能将所有的道路连通并且成本最低。你的任务就是编写一个程序来解决这个问题。
输入:
输入包含100组测试数据,结尾以单独一个0结束。每组数据包含一个数字 n 代表有 n个村庄, 1<n<27,这些村庄都有一个大写字母编号,每一行代表一个村庄编号, 然后是一个数字 k 代表有k个村庄与其相连, 然后是一个 字母
代表这个村庄与其相连, 然后一个数字代表成本。
输出
输出最小生成树的值。
题目分析:
这个是一个最小生成树的题目, 不用多说
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 1220 struct Edge { int s, e, w; Edge(int s=0,int e=0,int w=0):s(s), e(e), w(w) {} bool friend operator < (Edge A, Edge B) { return A.w < B.w; } }P[maxn]; int n, m; int Par[maxn]; void Init(); int Kruskal(); int GetPar(int a); void Meger(int a,int b); int main() { char str[2]; int k; int s, e, w; while(cin >> n, n) { Init(); for(int i=1; i<n; i++) { cin >> str >> k; s = str[0] - 'A'; for(int j=0; j<k; j++) { cin >> str >> w; e = str[0] - 'A'; P[m++] = Edge(s,e,w); } } sort(P,P+m); int ans = Kruskal(); cout << ans << endl; } return 0; } void Init() { m = 0; for(int i=0; i<=26; i++) { Par[i]=i; } } int Kruskal() { int sum = 0; int Nnode = 1; for(int i=0; i<m; i++) { if( GetPar(P[i].s) != GetPar(P[i].e) ) { sum += P[i].w; Meger(P[i].s,P[i].e); Nnode ++; } if(Nnode == n) return sum; } return -1; } int GetPar(int a) { if(Par[a] != a) Par[a] = GetPar(Par[a]); return Par[a]; } void Meger(int a,int b) { Par[GetPar(a)] = Par[GetPar(b)]; }