hdu1863 最小生成树(prim)

时间:2021-02-21 18:13:26

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1863

思路:最小生成树模板题,直接套模板。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF 1<<29 int mp[][];
int v[],d[]; int main()
{
int n,m;
while(scanf("%d%d",&m,&n)== && m)
{
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
if(i==j) mp[i][j]=;
else mp[i][j]=INF; memset(v,,sizeof(v));
int a,b,c;
for(int i=; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
mp[a][b]=c;
mp[b][a]=c;
}
for(int i=; i<=n; i++)
d[i]=mp[][i];
int p;
for(int i=; i<=n; i++)
{
int mi=INF;
for(int j=; j<=n; j++)
{
if(!v[j] && d[j]<mi)
mi=d[j],p=j;
}
v[p]=;
for(int j=; j<=n; j++)
{
if(!v[j] && mp[p][j]<d[j])
d[j]=mp[p][j];
}
} for(int i=; i<=n; i++) d[]+=d[i];
if(d[]>=INF) puts("?");
else printf("%d\n",d[]);
}
}