zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    spring通过注解依赖注入和获取xml配置混合的方式
    Spring 3.0就这么简单读书笔记
    spring源码测试
    spring文档翻译
    敏感词过滤算法
    mongodb的地理空间索引如何在solr中体现
    mongodb的地理空间索引常见的问题
    mysql的distinct理解
    zookeeper管理solr的配置文件
    驾校理论考试
  • 原文地址:https://www.cnblogs.com/darklights/p/7647320.html
Copyright © 2011-2022 走看看