poj 1751 Highways

点击打开链接poj 1751

思路:最小生成树+prime
分析:只要按照prime的思路求出所有的边,然后输出的时候判断是否是已经建好的即可。
注意:可能出现已经把所有的边都建好的情况,这个时候不用输出

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXN 1000

int n , m;
int vis[MAXN];
int pre[MAXN];
double lowcost[MAXN];
double G[MAXN][MAXN];
struct Point{
    int x;
    int y;
}p[MAXN];
struct Edge{
    int x;
    int y;
}ans[MAXN] , exist[MAXN];

/*初始化边的长度*/
void init(){
    for(int i = 1 ; i <= n ; i++){
       pre[i] = 1;
       for(int j = 1 ; j <= n ; j++){
          double tmp_x = (p[i].x-p[j].x)*(p[i].x-p[j].x);
          double tmp_y = (p[i].y-p[j].y)*(p[i].y-p[j].y);
          G[i][j] = sqrt(tmp_x + tmp_y);
       }
    }
}

/*prime求解最小生成树*/
void prime(){
     memset(vis , 0 , sizeof(vis));
     int pos , cnt;
     vis[1] = 1;
     cnt = 0;
     for(int i = 1 ; i <= n ; i++)
        lowcost[i] = G[1][i];
     for(int i = 1 ; i <= n ; i++){
        pos = -1;
        for(int j = 1 ; j <= n ; j++){
           if(!vis[j] && (pos == -1 || lowcost[j] < lowcost[pos]))
             pos = j;
        }
        if(pos == -1)
            break;
        vis[pos] = 1;
        ans[cnt].x = pre[pos];
        ans[cnt++].y = pos;
        for(int j = 1 ; j <= n ; j++){
           if(!vis[j] && lowcost[j] > G[j][pos]){
              lowcost[j] = G[j][pos];
              pre[j] = pos;
           }
        }
     }
}

/*输出*/
void output(){
     int flag , cnt;
     cnt = 0;
     for(int i = 0 ; i < n-1 ; i++){
         flag = 0;
         for(int j = 0 ; j < m ; j++){
            if(ans[i].x == exist[j].x && ans[i].y == exist[j].y){
               flag = 1;
               break;
            }
            else if(ans[i].x == exist[j].y && ans[i].y == exist[j].x){
               flag = 1;
               break;
            }
         }
         if(!flag){
             cnt++;
             printf("%d %d\n" , ans[i].x , ans[i].y);
         }
     }
}

int main(){
    int begin , end;
    scanf("%d" , &n);
    for(int i = 1 ; i <= n ; i++)
        scanf("%d%d" , &p[i].x , &p[i].y);
    init();
    scanf("%d" , &m);
    for(int i = 0 ; i < m ; i++){
       scanf("%d%d" , &begin , &end);
       G[begin][end] = G[end][begin] = 0;
       exist[i].x = begin;
       exist[i].y = end;
    }
    prime();
    output();
    return 0;
}
时间: 2024-10-29 08:15:58

poj 1751 Highways的相关文章

poj 1751 Highways MST

   水到家的一道题,居然WA了3次--没注意到距离是double--没有输出的话要输出一行空行  /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <

POJ 2485 Highways:最小生成树 Prim

Highways:http://poj.org/problem?id=2485 大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化的时候用memset一直RE,希望有知道怎么回事的不吝赐教,谢了~ 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ #include <stdio.h

poj 2485 Highways

点击打开链接poj 2485 思路:最小生成树+prime+最大边 分析:只要按照prime的算法的思路求出最大的边即可 代码: #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define MAXN 510 #define INF 0xFFFFFFF int t , n , ans; int vis[MAXN];

poj 2128 Highways

真是一道坑爹的题目,题目其实说的不是很清晰... WA了2次... [题意] 在一条单向公路上,有n个村庄,第i个村庄只能到i以后的村庄,而不能到i之前的村庄(因为是单行道).新村长要建两条新路,使得各个村庄之间都能走通(一条反向的就可以,为什么要建两条?题目说了,只建一条不足矣增加自己的政绩) [思路] 找出所有路段中最短的,加上原来的总长,就是答案.有一点要注意,题目说两条路的4个端点必须不同,因此要排除端点重合的问题.另外,n=2和n=3是无解的. 我们知道要满足条件,那么我们就必定使1~

最小生成树【完结】

第一题 hdu 1232 畅通工程 点击打开hdu 1232 思路:模板题 点击查看代码 第二题 hdu 1233 还是畅通工程 点击打开hdu 1233 思路:模板题 点击查看代码 第三题 uva 10034 Freckles 点击打开uva 10034 思路:模板题 点击查看代码 第四题 uva 10397 Connect the Campus 点击打开uva 10397 思路:模板题 点击查看代码 第五题 uva 10369 Arctic Network 点击打开uva 10369 思路:

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

POJ:DNA Sorting 特殊的排序

Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的很好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ 某人贴出的测试用例数据地址: http://poj.org/showmessage?message_id=76017 有

POJ 2240 Arbitrage:最短路 Floyd

Arbitrage:http://poj.org/problem?id=2240 大意: 给你m种货币,给你m种货币兑换规则,问通过这些规则最后能不能盈利.eg:1美元换0.5英镑,1英镑换10法郎,1法郎换0.21美元,这样1美元能换0.5*10*0.21=1.05美元,净赚0.05美元. 思路: 用Floyd找出每两种钱之间的最大兑换关系,遍历一遍,看有没有那种钱币最后能盈利,有就输出Yes,没有就是No.在处理钱币名称与编号之间的关系时,可以用map存(比较好用),当然也可以用字符串比较.