又做一遍此题练习PRIM :)
ATTENTION: memset()初始化是有局限性的——请查阅它的函数原型
/*
* HDU-1233 还是畅道工程
* mike-w
* 2011-8-17
* ----------------------
* 重新做一遍这个题,练习PRIM
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 100
#define INF 0xffff
int fill(int* s,int n,int e)
{
while(n-->0)
*s++=e;
return 0;
}
int main(void)
{
int N,nline;
int road[MAXN][MAXN];
int mdist[MAXN];
int in[MAXN];
int min;
long len;
int i,j,k,t1,t2,t3;
#ifndef ONLINE_JUDGE
freopen("1233.in","r",stdin);
#endif
while(scanf("%d",&N),N!=0)
{
memset(road,0,sizeof(road));
memset(in,0,sizeof(in));
fill(mdist+1,N,INF);
len=0;
nline=N*(N-1)/2;
for(i=0;i<nline;i++)
scanf("%d%d%d",&t1,&t2,&t3),road[t1][t2]=road[t2][t1]=t3;
mdist[1]=0; /* initialize */
for(i=1;i<=N;i++) /* loop for N times */
{
for(j=1;j<=N;j++) /* extract minimal */
if(!in[j])
break;
for(min=j++;j<=N;j++)
if(!in[j]&&mdist[j]<mdist[min])
min=j;
len+=(long)mdist[min];
in[min]=1;
for(k=1;k<=N;k++)
if(!in[k]&&road[min][k]<mdist[k])
mdist[k]=road[min][k];
}
printf("%ld\n",len);
}
return 0;
}