案例6-1.7 公路村村通 (30 分)
简单的最小生成树板子
#include<iostream>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1010;
int map[maxn][maxn];
int vis[maxn],dis[maxn];
int n,m;
int prim()
{
memset(dis,inf,sizeof(dis));
int sum=0;
for(int i=0;i<n;++i)
{
int t=-1;
for(int j=1;j<=n;++j)
{
if(vis[j]==0&&(t==-1||dis[j]<dis[t]))
t=j;
}
if(i&&dis[t]==inf)
return inf;
if(i)
sum+=dis[t];
vis[t]=1;
for(int j=1;j<=n;++j)
dis[j]=min(dis[j],map[t][j]);
}
return sum;
}
int main()
{
int x,y,z;
cin>>n>>m;
memset(map,inf,sizeof(map));
for(int i=1;i<=n;++i)
map[i][i]=0;
while(m--)
{
cin>>x>>y>>z;
map[x][y]=map[y][x]=min(map[x][y],z);
}
int sum=prim();
if(sum==inf)
cout<<-1;
else
cout<<sum;
return 0;
}