题解 最小生成树 POJ 2395
题解:有N个农场和M条路,每条路距离为Li。求小女孩从农场1遍历遍历所有农场的最小边长。
做法:prim最小生成树
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 999999999
using namespace std;
const int MAX=3000;
int v[MAX],a[MAX][MAX],dis[MAX];
int n,m;
void prim()
{
v[1]=1;
int i,len=0;
for(i=1;i<=n;i++)
{
dis[i]=a[1][i];
}
for(int k=1;k<n;k++)
{
int minn=INF;
int point=0;
for(i=1;i<=n;i++)
{
if((!v[i])&&dis[i]<minn)
{
minn=dis[i],point=i;
}
}
len=max(len,minn);
v[point]=1;
dis[point]=INF;
if(point!=0)
{
for(i=1;i<=n;i++)
if(!v[i]&&dis[i]>a[point][i])
{dis[i]=a[point][i];}
}
}
printf("%d\n",len);
}
int main()
{
int x,y,i,j,l;
memset(v,0,sizeof(v));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&l);
a[x][y]=min(a[x][y],min(a[y][x],l));
a[y][x]=a[x][y];
}
prim();
return 0;
}
错误:WA 原因:未考虑重边的情况
浙公网安备 33010602011771号