zoukankan      html  css  js  c++  java
  • LETTers比赛第七场 Qin Shi Huang's National Road System

    这道题和上次周杰出的相似三角形题,是我们校队在2011区预赛中做对的唯一的两道题,最终校队是以罚时的微弱劣势丧失银牌~

    解题思路很多种,这里提供一种自己的思路

    首先题目求解最小生成树(MST);这里用Prim算法并把最小生成树边的集合存起来;

    然后依次去掉每条边,考虑这个n-2边的图,两个for循环依次枚举这两个连通图上的点;得出最优值。

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<math.h>
      4 const int maxn=1000+10;
      5 typedef struct
      6 {
      7     int x,y;
      8     int p;
      9 }Node;
     10 typedef struct
     11 {
     12     int s,e;
     13     double w;
     14 }Edge;
     15 Node node[maxn];
     16 Edge Mst[maxn];
     17 double Gram[maxn][maxn];
     18 double Mst_W;
     19 double ans;
     20 int N_seq[maxn];
     21 int n;//节点数
     22 double Dis(int s,int e)
     23 {
     24     return (double)sqrt((node[s].x-node[e].x)*(node[s].x-node[e].x)+(node[s].y-node[e].y)*(node[s].y-node[e].y));
     25 }
     26 void Build_Gram()
     27 {
     28     scanf("%d",&n);
     29     int i,j;
     30     for(i=0;i<n;i++)
     31         scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].p);
     32     memset(Gram,0,sizeof(Gram));
     33     for(i=0;i<n;i++)
     34         for(j=0;j<n;j++)
     35         {
     36             Gram[i][j]=Dis(i,j);
     37         }
     38     return ;
     39 }
     40 void Build_Mst()
     41 {
     42     Mst_W=0;
     43     memset(Mst,0,sizeof(Mst));
     44     int i;
     45     for(i=0;i<n-1;i++)
     46     {
     47         Mst[i].e=i+1;
     48         Mst[i].s=0;
     49         Mst[i].w=Gram[0][i+1];
     50     }
     51     N_seq[0]=0;
     52     for(i=0;i<n-1;i++)
     53     {
     54         double min=99999999;
     55         int j,k;
     56         Edge temp;
     57         for(j=i;j<n-1;j++)if(min>Mst[j].w)
     58         {min=Mst[j].w;k=j;}
     59         Mst_W+=min;
     60         N_seq[i+1]=Mst[k].e;
     61         temp=Mst[i];Mst[i]=Mst[k];Mst[k]=temp;
     62         k=Mst[i].e;
     63         for(j=i+1;j<n-1;j++)
     64         {
     65         int    q=Mst[j].e;
     66             if(Gram[k][q]<Mst[j].w)
     67             {
     68                 Mst[j].w=Gram[k][q];
     69                 Mst[j].s=k;
     70             }
     71         }
     72     }
     73 }
     74 void Solve()
     75 {
     76     ans=0;
     77     int i,j,k;
     78     for(i=0;i<n-1;i++)
     79     {
     80         int p=0;
     81         for(j=0;j<i+1;j++)
     82             for(k=i+1;k<=n-1;k++)
     83             {
     84                 if(p<node[N_seq[j]].p+node[N_seq[k]].p)
     85                     p=node[N_seq[j]].p+node[N_seq[k]].p;
     86             }
     87         if(p*1.0/(Mst_W-Mst[i].w)>ans)
     88             ans=p*1.0/(Mst_W-Mst[i].w);
     89     }
     90 }
     91 int main()
     92 {
     93     int tt;
     94     scanf("%d",&tt);
     95     while(tt--)
     96     {
     97         Build_Gram();
     98         Build_Mst();
     99         Solve();
    100         printf("%.2lf\n",ans);
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    SQL-LINQ-Lambda 语法对照
    C#.NET面向对象(语法点)
    4.5 基于STM32+MC20远程短信控制开关
    4.4 使用STM32控制MC20进行GPS帧数据解析
    4.3 使用STM32控制MC20进行GPRS通讯
    4.2 使用STM32控制MC20发送短信
    4.1 使用STM32控制MC20拨打电话
    3.6.使用STC89C52控制MC20解析GPS的经纬度数据上传到指定服务器
    3.5.基于STC89C52+MC20的短信远程控制开关LCD1602显示
    3.4 使用STC89C52控制MC20解析GPS的经纬度数据在LCD1602上显示
  • 原文地址:https://www.cnblogs.com/LETTers/p/2470541.html
Copyright © 2011-2022 走看看