POJ 1751 Highways

来源:互联网 发布:招募淘宝分销商的语句 编辑:程序博客网 时间:2024/05/17 12:46

题目链接:kuangbin带你飞 专题六 最小生成树 H - Highways

题意

n个城市,需要修高速公路,将所有城市联通,已经修建好了m条高速公路,剩下未修的公路,怎样修能够使长度最小,输出这些公路的左右两端城市

思路

典型的最小生成树,因为需要输出边左右结点,维护一个fa[N]数组即可。将已经见好的公路所对应边的权值置为0。还是prim

代码

////  main.cpp//  demo////  Created by shiyi-mac on 16/1/2.//  Copyright © 2016年 shiyi-mac. All rights reserved.//#include <algorithm>#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <queue>#include <stack>#include <vector>using namespace std;const int N = 759;const int MAX = 1000000;double g[N][N];double d[N];int x[N], y[N];int fa[N];void prim(int n){    for(int i=2;i<=n;i++)    {        d[i] = g[1][i];        fa[i] = 1;    }    d[1] = -1;    int pos = 0;    for(int i=1;i<n;i++)    {        double min = MAX;        int imin = -1;        for(int j=1;j<=n;j++)            if(d[j]!=-1 && min > d[j])                min = d[j], imin = j;        if(min != 0)            printf("%d %d\n", imin, fa[imin]);        d[imin] = -1;        for(int j=1;j<=n;j++)            if(d[j]!=-1 && d[j] > g[imin][j])            {                d[j] = g[imin][j];                fa[j] = imin;            }    }}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    scanf("%d%d",&x[i], &y[i]);    for(int i=1;i<=n;i++)        for(int j=i+1;j<=n;j++)        {            double l = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));            g[j][i] = g[i][j] = l;        }    int q;    scanf("%d",&q);    for(int i=0;i<q;i++)    {        int a, b;        scanf("%d%d",&a, &b);        g[a][b] = g[b][a] = 0;    }    prim(n);    return 0;}
0 0
原创粉丝点击