这是双向的,一开始调数据怎么都不对,后来一想这有双向边才符合输出!!1A
#include<iostream>
using namespace std;
int map[55][55],dis[55],vis[55];
int n,m,x,y,l;
int sum;
void prim(int k)
{
int temp;
for(int i=1;i<=n;i++)
dis[i]=map[k][i];
vis[k]=1;
for(int i=1;i<=n;i++)
{
int cf=0x7FFFFFFF;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]<cf)
{
temp=j;
cf=dis[j];
}
if(cf==0x7FFFFFFF)
cf=0;
sum+=cf;
vis[temp]=true;
for(int j=1;j<=n;j++)
if(!vis[j]&&map[temp][j]<dis[j])
dis[j]=map[temp][j];
}
}
int main()
{
while(cin>>n,n)
{
for(int i=0;i<55;i++)
for(int j=0;j<55;j++)
{
map[i][j]=0x7FFFFFFF;
}
cin>>m;
while(m--)
{
scanf("%d%d%d",&x,&y,&l);
if(map[x][y]!=0x7FFFFFFF)
map[x][y]=map[y][x]=min(map[x][y],l);
else
map[x][y]=map[y][x]=l;
}
int ans=0x7FFFFFFF;
memset(vis,0,sizeof(vis));
sum=0;
prim(1);
cout<<sum<<endl;
}
return 0;
}