用prime来做,不会超时,在prime中记住ans初始化为0,而且比较是G[k][j]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+10;
const int INF=1000000000;
int G[maxn][maxn];
int prime(int n)
{
int vis[maxn]={0,1},dis[maxn],ans=0;
for(int i=1;i<=n;i++)
{
dis[i]=G[1][i];
}
for(int i=1;i<n;i++)
{
int k=-1,minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
minn=dis[k=j];
}
vis[k]=1;ans+=minn;
for(int j=1;j<=n;j++)
{
if(!vis[j])
dis[j]=min(dis[j],G[k][j]);
}
}
return ans;
}
void init(int n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
G[i][j]=i==j?0:INF;
}
}
}
int main()
{
int n;
//freopen("L.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
init(n);
int len=n*(n-1)/2;
int x,y,w;
for(int i=1;i<=len;i++)
{
scanf("%d %d %d",&x,&y,&w);
G[x][y]=G[y][x]=min(G[x][y],w);
}
int ans=prime(n);
printf("%d\n",ans);
}
return 0;
}