题解 最小生成树 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 原因:未考虑重边的情况

posted on 2014-07-30 15:23  一锅土豆  阅读(78)  评论(0编辑  收藏  举报