POJ1751 Highways【最小生成树】

题意:

给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的)。

但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的城市,问最短费用。

思路:

lowcost[i]数组存还未处理的城市i离已经处理过的城市的最短距离,pre[i]]数组存还未处理的城市i离已经处理过的哪个城市最近。

代码:

prime:

#include <iostream>
#include <cstdio>
#define inf 0x3f3f3f3f

using namespace std;

const int N=10005;
const int M=15005;
int n,m,k,edg[N][N],x[N],y[N],lowcost[N],pre[N];

void Prim()
{
  for(int i=1;i<=n;i++)
  {
    lowcost[i]=edg[1][i];
    pre[i]=1;
  }
  lowcost[1]=-1;
  for(int i=1;i<n;i++)
  {
      int minn=inf;
      for(int j=1;j<=n;j++)
      {
        if(lowcost[j]!=-1&&lowcost[j]<minn)
        {
            minn=lowcost[j];
            k=j;
        }
      }
      if(lowcost[k]!=0)
         cout<<pre[k]<<" "<<k<<endl;
      lowcost[k]=-1;
      for(int j=1;j<=n;j++)
      {
        if(edg[j][k]<lowcost[j])
        {
            lowcost[j]=edg[j][k];
            pre[j]=k;
        }
      }
  }
}

int main()
{
      while(cin>>n)
      {
        for(int i=1; i<=n; i++)
        {
            cin>>x[i]>>y[i];
            for(int j=1; j<i; j++)
               edg[i][j]=edg[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
            edg[i][i]=inf;
        }
        cin>>m;
        for(int i=0; i<m; i++)
        {
            int a,b;
            cin>>a>>b;
            edg[a][b]=edg[b][a]=0;
        }
        Prim();
    }
    return 0;
}

 

posted @ 2017-10-10 19:14  codeg  阅读(119)  评论(0编辑  收藏  举报