http://acm.hdu.edu.cn/showproblem.php?pid=1301
prime
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 30;
int n;
int mp[N][N];
int dis[N];
int vis[N];
int prime(int s)
{
int sum = 0;
for(int i = 0;i < n;i ++)
dis[i] = mp[s][i];
vis[s] = 1;
for(int i = 1;i <= n - 1;i ++)
{
// n - 1次迭代
int minn = inf;
int p;
for(int j = 0;j < n;j ++)
{
if(!vis[j] && dis[j] < minn)
minn = dis[j], p = j;
}
vis[p] = 1;
sum += minn;
for(int j = 0;j < n;j ++)
{
if(!vis[j] && dis[j] > mp[p][j])
dis[j] = mp[p][j];
}
}
return sum;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
while(cin >> n && n)
{
memset(mp,inf,sizeof(mp));
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
char cc;
int m;
for(int i = 1;i < n;i ++)
{
cin >> cc >> m;
int v;
for(int j = 1;j <= m;j ++)
{
cin >> cc >> v;
mp[i - 1][cc - 'A'] = v;
mp[cc - 'A'][i - 1] = v;
}
}
cout << prime(0) << '\n';
}
return 0;
}
Kruskal
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 30;
const int M = 100;
struct edge{
int a, b;
int v;
};
edge e[M];
int fa[N];
int n; //n是点数,m是边数
void init()
{
for(int i = 0;i < N;i ++)
fa[i] = i;
}
bool cmp(edge a,edge b)
{
return a.v < b.v;
}
int Find(int x)
{
if(x != fa[x])
fa[x] = Find(fa[x]);
return fa[x];
}
int Merge(int x,int y)
{
int fx = Find(x);
int fy = Find(y);
if(fx != fy)
{
fa[fx] = fy;
return 1;
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
while(cin >> n && n)
{
init();
char ch1, ch2;
int m;
int se = 0;
for(int i = 1;i < n;i ++)
{
cin >> ch1 >> m;
int v;
for(int j = 0;j < m;j ++)
{
cin >> ch2 >> v;
e[se].a = ch1 - 'A';
e[se].b = ch2 - 'A';
e[se].v = v;
se ++;
}
}
sort(e, e + se, cmp);
int sum = 0;
for(int i = 0;i < se;i ++)
{
if(Merge(e[i].a, e[i].b))
sum += e[i].v;
}
cout << sum << '\n';
}
return 0;
}