题目描述
输入
输出
示例输入
5 8 1 2 12 1 3 9 1 4 11 1 5 3 2 3 6 2 4 9 3 4 4 4 5 6
示例输出
19
提示
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 0x3f3f3f
int mp[1010][1010],vis[1010],dis[1010],flag;
int prim(int n)
{
int i,j,k,sum=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
{
dis[i]=mp[1][i];
}
vis[1]=1;
for(i=2;i<=n;i++)
{
int min=inf;
for(j=1;j<=n;j++)
{
if(dis[j]<min&&!vis[j])
{
k=j;
min=dis[j];
}
}
if(min==inf)//全部都是inf说明该点无临点
{
flag=0;
break;
}
vis[k]=1;
sum+=min;
for(j=1;j<=n;j++)
{
if(mp[k][j]<dis[j]&&!vis[j])
{
dis[j]=mp[k][j];
}
}
}
return sum;
}
int main()
{
int n,m,i,j,u,v,w,x;
while(~scanf("%d%d",&n,&m))
{ flag=1;
memset(mp,inf,sizeof(mp));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
mp[u][v]=mp[v][u]=w;
}
x=prim(n);
if(flag==1)
printf("%d\n",x);
else
printf("-1\n");
}
return 0;
}