链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1233
最小生成树,Prim和Kruskal
Prim:
#include <cstdio>
#include <climits>
#include <cstring>
using namespace std;
int map[101][101];
bool used[101];
int Prim(int n)
{
int sum=0;
int mini,t,T=n-1;
while(T--)
{
mini=INT_MAX;
for(int i=2; i<=n; i++)
if(!used[i] && mini>map[1][i])
{
t=i;
mini=map[1][i];
}
used[t]=1;
sum+=mini;
for(int i=2; i<=n; i++)
if(!used[i] && map[1][i]>map[t][i])
map[1][i]=map[t][i];
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{
int i,j,dis,T=n*(n-1)/2;
memset(map,INT_MAX,sizeof(map));
while(T--)
{
scanf("%d %d %d",&i,&j,&dis);
map[i][j]=map[j][i]=dis;
}
memset(used,0,sizeof(used));
printf("%d\n",Prim(n));
}
return 0;
}
Kruskal:
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int b,e,dis;
} s[5000];
int n,m,father[101];
bool cmp(node a,node b)
{
return a.dis < b.dis;
}
int find(int x)
{
return father[x]==x ? x : father[x]=find(father[x]);
}
int main()
{
while(scanf("%d",&n),n)
{
m=n*(n-1)/2;
for(int i=0; i<101; i++) father[i]=i;
for(int i=0; i<m; i++) scanf("%d %d %d",&s[i].b,&s[i].e,&s[i].dis);
sort(s,s+m,cmp);
int sum=0;
for(int i=0; i<m; i++)
{
int x=find(s[i].b);
int y=find(s[i].e);
if(x!=y)
{
father[y]=x;
sum+=s[i].dis;
}
}
printf("%d\n",sum);
}
return 0;
}