题解 最小生成树 POJ 1751

题意:给N和N个城市的坐标,M个两个城市间已搭建的桥,求用最少的距离搭桥使N个城市连接在一起。

做法:用prim最小生成树,和并查集。将每个节点的父亲节点记录下来用于输出。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0xFFFFFF
using namespace std;
struct xoy{int x, y;};
const int MAX=10000;
int v[MAX],a[MAX][MAX],dis[MAX];
xoy dot[MAX];
int n,m;
void prim()
{
    v[1]=1;
    int i,in[MAX];
    for(i=1;i<=n;i++)
    {
        dis[i]=a[1][i];
        in[i]=1;
    }
    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;
             }
        }
        if(minn!=0)
        printf("%d %d\n",point,in[point]);
        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];in[i]=point;}
        }
    }
}
int main()
{
    int x,y,i,j;
    memset(v,0,sizeof(v));
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&dot[i].x,&dot[i].y);
    }
    for(i=1;i<=n;i++)
  {
     for(j=1;j<=n;j++)
    {
        a[i][j]=(dot[i].x-dot[j].x)*(dot[i].x-dot[j].x)+(dot[i].y-dot[j].y)*(dot[i].y-dot[j].y);
    }
  }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        a[x][y]=a[y][x]=0;
    }
    prim();
    return 0;
}

错误:WA 设置INF过小

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