Highways
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 13182   Accepted: 3814   Special Judge

Description

The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system of public highways. The Flatopian government is aware of this problem and has already constructed a number of highways connecting some of the most important towns. However, there are still some towns that you can't reach via a highway. It is necessary to build more highways so that it will be possible to drive between any pair of towns without leaving the highway system.

Flatopian towns are numbered from 1 to N and town i has a position
given by the Cartesian coordinates (xi, yi). Each highway connects
exaclty two towns. All highways (both the original ones and the ones
that are to be built) follow straight lines, and thus their length is
equal to Cartesian distance between towns. All highways can be used in
both directions. Highways can freely cross each other, but a driver can
only switch between highways at a town that is located at the end of
both highways.

The Flatopian government wants to minimize the cost of building new
highways. However, they want to guarantee that every town is
highway-reachable from every other town. Since Flatopia is so flat, the
cost of a highway is always proportional to its length. Thus, the least
expensive highway system will be the one that minimizes the total
highways length.

Input

The
input consists of two parts. The first part describes all towns in the
country, and the second part describes all of the highways that have
already been built.

The first line of the input file contains a single integer N (1
<= N <= 750), representing the number of towns. The next N lines
each contain two integers, xi and yi separated by a space. These values
give the coordinates of ith town (for i from 1 to N). Coordinates will have an absolute value no greater than 10000. Every town has a unique location.

The next line contains a single integer M (0 <= M <= 1000),
representing the number of existing highways. The next M lines each
contain a pair of integers separated by a space. These two integers give
a pair of town numbers which are already connected by a highway. Each
pair of towns is connected by at most one highway.

Output

Write
to the output a single line for each new highway that should be built in
order to connect all towns with minimal possible total length of new
highways. Each highway should be presented by printing town numbers that
this highway connects, separated by a space.

If no new highways need to be built (all towns are already
connected), then the output file should be created but it should be
empty.

Sample Input

9
1 5
0 0
3 2
4 5
5 1
0 4
5 2
1 2
5 3
3
1 3
9 7
1 2

Sample Output

1 6
3 7
4 9
5 7
8 3
【题意】给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的)。
但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的城市,问最短费用。
【分析】一道典型的最小生成树题,lowcost[i]数组存还未处理的城市i离已经处理过的城市的最短距离,pre[i]]数组存还未处理的
城市i离已经处理过的哪个城市最近。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include<functional>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int N=;
const int M=;
int n,m,k,edg[N][N],x[N],y[N],lowcost[N],pre[N];
void Prim() {
for(int i=;i<=n;i++){
lowcost[i]=edg[][i];
pre[i]=;
}
lowcost[]=-;
for(int i=;i<n;i++){
int minn=inf;
for(int j=;j<=n;j++){
if(lowcost[j]!=-&&lowcost[j]<minn){
minn=lowcost[j];
k=j;
}
}
if(lowcost[k]!=)printf("%d %d\n",pre[k],k);
lowcost[k]=-;
for(int j=;j<=n;j++){
if(edg[j][k]<lowcost[j]){
lowcost[j]=edg[j][k];
pre[j]=k;
}
}
}
}
int main() {
while(~scanf("%d",&n)) {
for(int i=; i<=n; i++) {
scanf("%d%d",&x[i],&y[i]);
for(int j=; 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;
}
scanf("%d",&m);
for(int i=; i<m; i++) {
int ita,itb;
scanf("%d%d",&ita,&itb);
edg[ita][itb]=edg[itb][ita]=;
}
Prim();
}
return ;
}

POJ1751 Highways(Prim)的更多相关文章

  1. Highways POJ-1751 最小生成树 Prim算法

    Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...

  2. 快速切题 poj 2485 Highways prim算法+堆 不完全优化 难度:0

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23033   Accepted: 10612 Descri ...

  3. POJ-1751 Highways(最小生成树消边+输出边)

    http://poj.org/problem?id=1751 Description The island nation of Flatopia is perfectly flat. Unfortun ...

  4. POJ 2485 Highways (prim最小生成树)

    对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...

  5. POJ1751 Highways【最小生成树】

    题意: 给你N个城市的坐标,城市之间存在公路,但是由于其中一些道路损坏了,需要维修,维修的费用与公路长成正比(公路是直的). 但现有M条公路是完整的,不需要维修,下面有M行,表示不需要维修的道路两端的 ...

  6. POJ1751 Highways 2017-04-14 15:46 70人阅读 评论(0) 收藏

    Highways Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14819   Accepted: 4278   Speci ...

  7. POJ1751 Highways

    题目链接    http://poj.org/problem?id=1751 题目大意:输入n:然后给你n个点的坐标(任意两点之间皆可达):输入m:接下来m行每行输入两个整数x,y表示 点x与点y 已 ...

  8. Highways(prim)

    http://poj.org/problem?id=2485 此题是求最小生成树里的最大权值.prim算法: #include<stdio.h> #include<string.h& ...

  9. 最小生成树练习3(普里姆算法Prim)

    风萧萧兮易水寒,壮士要去敲代码.本女子开学后再敲了.. poj1258 Agri-Net(最小生成树)水题. #include<cstdio> #include<cstring> ...

随机推荐

  1. 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树

    自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...

  2. [洛谷P3803] 【模板】多项式乘法(FFT, NTT)

    题目大意:$FFT$,给你两个多项式,请输出乘起来后的多项式. 题解:$FFT$,由于给的$n$不是很大,也可以用$NTT$做 卡点:无 C++ Code:  FFT: #include <cs ...

  3. php: Can't use function return value in write context

    关于empty()函数, php手册中提到,php5.5之前empty()函数只支持检查变量,传入任何其他的表达式或函数都会产生语法错误. Note: Prior to PHP 5.5, empty( ...

  4. 洛谷 P1502 窗口的星星 解题报告

    P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...

  5. 获取Parameter参数值,方便调试使用

    #region #warning 调试使用,获取sql参数化,拼接出完整的sql语句,复制sql明文到mssql中运行 string debugSql = queryHelper.CommandTex ...

  6. bzoj3343: 教主的魔法 分块 标记

    修改:两边暴力重构,中间打标记.复杂度:O(n0.5) 查询:中间二分两边暴力.O(n0.5logn0.5) 总时间复杂度O(n*n0.5logn0.5) 空间复杂度是n级别的 标记不用下传因为标记不 ...

  7. 使用es6一行搞定文字溢出省略号

    使用的是es6中扩展字符串方法参考地址 padStart(),padEnd() 使用padStart() 两个参数padStart(字符串最小长度,用来补全的字符串): 例如 let str = '1 ...

  8. Expect使用小记

    By francis_hao    May 31,2017   本文翻译了部分Expect的man手册,只选取了个人常用的功能,因此并不完善.   Expect是一个可以和交互式程序对话的程序 概述 ...

  9. POJ3189:Steady Cow Assignment(二分+二分图多重匹配)

    Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7482   Accepted: ...

  10. java中枚举类到高级使用

    参考博文: http://blog.csdn.net/qq_31655965/article/details/55049192 http://www.cnblogs.com/zhaoyanjun/p/ ...