• Arctic Network


    poj2349:http://poj.org/problem?id=2349

    题意:有卫星电台的城市之间可以任意联络。没有卫星电台的城市只能和距离小于等于D的城市联络。告诉你卫星电台的个数S,让你求最小的D.

    题解: 生成最小生成树,去掉最长的S条边后,剩下最长的边就是D.也就是求最小生成树中第S+1长的边。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define INF 100000000.0
     7 using namespace std;
     8 int cas,x,y,top;
     9 int n,s;
    10 double lowcost[502],ans[502],g[502][502];
    11 struct Node{
    12     int x;
    13     int y;
    14 }node[103];
    15 double juli(Node a,Node b ){
    16     return sqrt(((double)a.x-b.x)*(a.x-b.x)+((double)a.y-b.y)*(a.y-b.y));
    17 }
    18 void prim(int v0){
    19     top=0;
    20     for(int i=1;i<=n;i++){
    21         lowcost[i]=g[v0][i];
    22     }
    23     lowcost[v0]=-1;
    24     for(int i=1;i<n;i++){
    25         double min=INF;
    26         int v=-1;
    27         for(int j=1;j<=n;j++){
    28             if(lowcost[j]!=-1&&lowcost[j]<min){
    29                 min=lowcost[j];
    30                 v=j;
    31             }
    32         }
    33         if(v!=-1){
    34             ans[top++]=lowcost[v];
    35             lowcost[v]=-1;
    36             for(int k=1;k<=n;k++){
    37                 if(lowcost[k]!=-1&&g[v][k]<lowcost[k]){
    38                     lowcost[k]=g[v][k];
    39                 }
    40             }
    41         }    
    42     }
    43 }
    44 void solve(){
    45     sort(ans,ans+top);
    46     printf("%.2f
    ",ans[top-s]);
    47 }
    48 int main(){
    49     scanf("%d",&cas);
    50     while(cas--){
    51         scanf("%d%d",&s,&n);
    52         for(int i=1;i<=n;i++){
    53             scanf("%d %d",&node[i].x,&node[i].y);
    54         }
    55         for(int i=1;i<=n;i++)
    56           for(int j=i+1;j<=n;j++){
    57               g[i][j]=g[j][i]=juli(node[i],node[j]);
    58           //    printf("%.2f
    ",g[i][j]);
    59           }
    60           for(int i=1;i<=n;i++)
    61             for(int j=1;j<=n;j++){
    62               if(i==j)g[i][j]=0;
    63               else if(g[i][j]==0)g[i][j]=INF;    
    64               }
    65           prim(1);
    66           solve();
    67     }
    68 }
    View Code
  • 相关阅读:
    git和svn
    [Luogu] P1144 最短路计数
    [Luogu] CF280C Game on Tree
    LCA的一种优秀实现方式(倍增+dfs序)
    [Luogu] P1131 [ZJOI2007]时态同步
    [Luogu] P2285 [HNOI2004]打鼹鼠
    背包相关问题总结
    【笔记】模拟梯度下降法的实现
    【笔记】梯度下降法的简单了解
    【笔记】线性回归的可解性和更多思考及线性回归总结
  • 原文地址:https://www.cnblogs.com/chujian123/p/3375164.html
Copyright © 2020-2023  润新知