hdu1233
#include<stdio.h>
#include<string.h>
#define N 100+5
#define MAX 9999
int map[N][N];
int d[N];
int n,ans;
void prim(){
int i,j,k,min;
for(i=1;i<=n;i++)
d[i]=map[1][i];
ans+=d[1];
d[1]=0;//进入最小生成树
for(i=1;i<=n;i++){
min=MAX;
for(j=1;j<=n;j++){
if(min>d[j]&&d[j]!=0){
k=j;
min=d[j];
}
}
ans+=d[k];
d[k]=0;//进入最小生成树
for(j=1;j<=n;j++){
if(d[j]>map[k][j]&&d[j]!=0){
d[j]=map[k][j];
}
}
}
return ;
}
int main(){
int i,j,t;
int t1,t2,val;
while(scanf("%d",&n)==1,n){
t=n*(n-1)/2;
memset(map,MAX,sizeof(map));
memset(d,MAX,sizeof(d));
for(i=1;i<=n;i++)map[i][i]=0;
for(i=0;i<t;i++){
scanf("%d%d%d",&t1,&t2,&val);
if(map[t1][t2]>val)
map[t1][t2]=map[t2][t1]=val;
}
ans=0;
prim();
printf("%d\n",ans);
}
return 0;
}
简单的prim
我都能一遍AC 。。。oh yeah!
keep moving...

浙公网安备 33010602011771号