思路:

一开始用Kruskal超时了,因为这是一个稠密图,边的数量最惨可能N^2,改用Prim。

Prim是这样的,先选一个点(这里选1)作为集合A的起始元素,然后其他点为集合B的元素,我们要做的就是每次找到B中的一个点,满足这个点到A的权值是B到A的权值中最小的,然后我们把这个点加入到A,再更新B中的点到A的最小距离。

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 750+5;
int mp[N][N]; //i j的距离
int vis[N];
int dis[N]; //点到集合的最小距离
int lian[N];
int n;
struct node{
int x,y;
}p[N];
void init(){
for(int i = 1;i <= n;i++){ //建图
scanf("%d%d",&p[i].x,&p[i].y);
for(int j = 1;j <= i;j++){
mp[i][j] = mp[j][i] = (p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y);
}
}
int Q,a,b;
scanf("%d",&Q);
while(Q--){
scanf("%d%d",&a,&b);
mp[a][b] = mp[b][a] = 0;
}
memset(vis,0,sizeof(vis)); //标记该点是否连接
for(int i = 1;i <= n;i++){
dis[i] = mp[i][1];
lian[i] = 1; //初始都和1的距离最小
}
vis[1] = 1;
}
void Prim(){
for(int i = 1;i < n;i++){ //找n-1条边
int MIN = 100000005;
int point;
for(int j = 1;j <= n;j++){
if(!vis[j] && dis[j] < MIN){
MIN = dis[j];
point = j;
}
}
vis[point] = 1; //找到了
if(mp[point][lian[point]] != 0) //为零是已经有路的
printf("%d %d\n",point,lian[point]); //点和他相连的点
for(int j = 1;j <= n;j++){
if(!vis[j] && mp[j][point] < dis[j]){
lian[j] = point;
dis[j] = mp[j][point];
}
}
}
}
int main(){
scanf("%d",&n);
init();
Prim();
return 0;
}

POJ 1751 Highways(最小生成树&Prim)题解的更多相关文章

  1. POJ 1751 Highways(最小生成树Prim普里姆,输出边)

    题目链接:点击打开链接 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has ...

  2. POJ 1751 Highways (最小生成树)

    Highways Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  3. POJ 1751 Highways (最小生成树)

    Highways 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/G Description The island nation ...

  4. POJ 1751 Highways 【最小生成树 Kruskal】

    Highways Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23070   Accepted: 6760   Speci ...

  5. POJ 1751 Highways (kruskal)

    题目链接:http://poj.org/problem?id=1751 题意是给你n个点的坐标,然后给你m对点是已经相连的,问你还需要连接哪几对点,使这个图为最小生成树. 这里用kruskal不会超时 ...

  6. POJ 2485 Highways(最小生成树+ 输出该最小生成树里的最长的边权)

                                                                                                         ...

  7. Building a Space Station POJ 2031 【最小生成树 prim】

    http://poj.org/problem?id=2031 Description You are a member of the space station engineering team, a ...

  8. poj 2485 Highways 最小生成树

    点击打开链接 Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19004   Accepted: 8815 ...

  9. (poj) 1751 Highways

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor ...

随机推荐

  1. Heavy Transportation---poj1797

    求(Dijkstra算法,求每条路径上的最小值 的最大值)和青蛙的那题类似:   #include<iostream> #include<stdio.h> #include&l ...

  2. Python命令行解析库argparse(转)

    原文:http://www.cnblogs.com/linxiyue/p/3908623.html 2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse ...

  3. idong常用js总结

    1.判断屏幕高度 $(document).ready(function() {    $("#left").height($(window).height());    $(&qu ...

  4. 【从0開始Tornado建站】显示全部注冊用户

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/littlethunder/article/details/25559749         显示注冊 ...

  5. MySQL管理之道:性能调优、高可用与监控》迷你书

    MySQL管理之道:性能调优.高可用与监控>迷你书 MYSQL5.5.X主要改进 1.默认使用innodb存储引擎2.充分利用CPU多核处理能力3.提高刷写脏页数量和合并插入数量,改善I/O4. ...

  6. 你应该知道的最好Webmail邮件客户端,

    1 . Kite Kite is an opensource replacement to Gmail. Kite is a webmail designed to look a lot like g ...

  7. 剑指offer3

    输入一个链表,从尾到头打印链表每个节点的值. 思路:首先借助一个栈,遍历链表中的每一个值,然后存储到栈中,利用栈的先进后出特点,然后添加到数组中返回. package demo3; import ja ...

  8. 禁止F12与右键

    实践项目的代码哦,给大家分享下,如何屏蔽右键与F12. 应用网站  www.empiretreasure.vip   与       www.MineBook.vip.可以去逛逛哦. 不多说了,上代码 ...

  9. form中的fieldset标签应用

    不得不说,<fieldset>是个漂亮的家伙. 使用<fieldset>与<legend>可以设计出很好的表单. <style> fieldset:nt ...

  10. C++ 简明教程

    C++是一种系统编程语言.用它的发明者, Bjarne Stroustrup的话来说,C++的设计目标是: 成为“更好的C语言” 支持数据的抽象与封装 支持面向对象编程 支持泛型编程 C++提供了对硬 ...