这周要被累死了......
周末终于抽出时间来刷刷题....
先来道kruskal热热身哈
http://poj.org/problem?id=1251
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0先输入n,然后共有n-1个点,每行先输入某个点,以及连接了这个点的边。 这行的后面是该边连接的另一点以及距离。
最后输出最小生成树的权值。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 110;
int fa[maxn];
int findd(int x)
{
if(x==fa[x]) return x;
return fa[x]=findd(fa[x]);
}
void Union(int x,int y)
{
int fx=findd(x);
int fy=findd(y);
fa[fx]=fy;
}
struct Side
{
int r,l,w;
bool operator<(const Side & ano)const
{
return w<ano.w;
}
}side[80];
int main()
{
//freopen("input.txt","r",stdin);
int n;
int m;
while(cin>>n,n)
{
m=-1;
int nn=n;
n--;
while(n--)
{
char l;int t;
cin>>l>>t;
for(int i=0;i<t;i++)
{
char r;int w;
cin>>r>>w;
//
side[++m].l=l-'A';
side[m].r=r-'A';
side[m].w=w;
}
}
for(int i=0;i<nn;i++)
fa[i]=i;
sort(side,side+m+1);
int res=0;
for(int i=0;i<m+1;i++)
{
int fx=findd(side[i].l);
int fy=findd(side[i].r);
if(fx!=fy)
{
res+=side[i].w;
fa[fx]=fy;
}
}
cout<<res<<endl;
}
return 0;
}