http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406
最小生成成树之Prim算法
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
int Prim(int a[][26], int n)
{
int cost = 0;
vector<int> known;
known.push_back(0); // Add first node
bool bKnown[26];
memset(bKnown, false, sizeof(bKnown));
bKnown[0] = true;
while (known.size() < n)
{
int minCost = 101;
int minNodeId;
for (vector<int>::iterator it = known.begin(); it != known.end(); it++)
for (int i = 0; i < n; i++)
if (a[*it][i] > 0 && a[*it][i] < minCost && bKnown[i] == false)
{
minCost = a[*it][i];
minNodeId = i;
}
known.push_back(minNodeId);
bKnown[minNodeId] = true;
cost += minCost;
}
return cost;
}
int main()
{
int n;
int a[26][26];
while (cin >> n && n > 0)
{
memset(a, 0, sizeof(a));
for (int i = 0; i < n - 1; i++)
{
char from, to;
int k, cost;
cin >> from >> k;
for (int j = 0; j < k; j++)
{
cin >> to >> cost;
a[from - 'A'][to - 'A'] = cost;
a[to - 'A'][from - 'A'] = cost;
}
}
cout << Prim(a, n) << endl;
}
}