zoukankan      html  css  js  c++  java
  • [题解]RQNOJ PID86 智捅马蜂窝

    链接:http://www.rqnoj.cn/problem/86

    思路:单源点最短路

            建图:首先根据父子关系连双向边,边权是距离/速度;再根据跳跃关系连单向边,边权是自由落体的时间(注意自由下落是一个匀加速过程,若中途停下再跳一定没有直接跳优)。

    我的实现:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cmath>
      5 #include <algorithm>
      6 #include <queue>
      7 using namespace std;
      8 #define MaxN 120
      9 #define MaxM 320
     10 #define INF 100000
     11 struct P
     12 {
     13     int v,x,y;
     14 }Point[MaxN];
     15 struct node
     16 {
     17     int v;
     18     double dist;
     19     node *next;
     20 };
     21 node Edge[MaxM];
     22 node *cnt=&Edge[0];
     23 node *adj[MaxN];
     24 double Dist[MaxN];
     25 int N,V;
     26 inline void Get_int(int &Ret)
     27 {
     28     char ch;
     29     bool flag=false;
     30     for(;ch=getchar(),ch<'0'||ch>'9';)
     31         if(ch=='-')
     32             flag=true;
     33     for(Ret=ch-'0';ch=getchar(),ch>='0'&&ch<='9';Ret=Ret*10+ch-'0');
     34     flag&&(Ret=-Ret);
     35 }
     36 inline double Dis(int a,int b)
     37 {
     38     double dx=(double)(Point[a].x-Point[b].x);
     39     double dy=(double)(Point[a].y-Point[b].y);
     40     return sqrt(dx*dx+dy*dy);
     41 }
     42 inline void Addedge(int u,int v,double w)
     43 {
     44     node *p=++cnt;
     45     p->v=v;
     46     p->dist=w;
     47     p->next=adj[u];
     48     adj[u]=p;
     49 }
     50 bool Cmp(P a,P b)
     51 {
     52     return ((a.x<b.x)||(a.x==b.x&&a.y<b.y));
     53 }
     54 inline void Read_Build()
     55 {
     56     Get_int(N); Get_int(V);
     57     int i,j,pos,fa;
     58     double T;
     59     for(i=1;i<=N;++i)
     60     {
     61         Get_int(Point[i].x);Get_int(Point[i].y);
     62         Point[i].v=i;
     63         Get_int(fa);
     64         if(!fa) continue;
     65         T=Dis(i,fa)/(double)V;
     66         Addedge(i,fa,T); Addedge(fa,i,T);
     67     }
     68     sort(Point+1,Point+N+1,Cmp);
     69     for(i=2;i<=N;i++)
     70     {
     71         if(Point[i].x!=Point[i-1].x)
     72         {
     73             pos=i;
     74         }
     75         else
     76         {
     77             for(j=pos;j<i;j++)
     78             {
     79                 T=sqrt((double)(Point[i].y-Point[j].y)/5.0);
     80                 Addedge(Point[i].v,Point[j].v,T);
     81             }
     82         }
     83 
     84     }
     85 }
     86 struct cmp
     87 {
     88     bool operator()(node a,node b)
     89     {
     90         return a.dist>b.dist;
     91     }
     92 };
     93 priority_queue <node, vector<node>, cmp> q;
     94 void Dijkstra(int s)
     95 {
     96     node c,d,*p;
     97     int u,v;
     98     for(int i=1;i<=N;i++)
     99         Dist[i]=INF;
    100     Dist[s]=0;
    101     c.v=s;c.dist=0;
    102     q.push(c);
    103     while(!q.empty())
    104     {
    105         d=q.top();q.pop();
    106         u=d.v;
    107         for(p=adj[u];p!=NULL;p=p->next)
    108         {
    109             v=p->v;
    110             if(Dist[v]>Dist[u]+p->dist)
    111             {
    112                 Dist[v]=Dist[u]+p->dist;
    113                 d.v=v;d.dist=Dist[v];
    114                 q.push(d);
    115             }
    116         }
    117     }
    118 }
    119 int main()
    120 {
    121     Read_Build();
    122     Dijkstra(1);
    123     printf("%.2lf
    ",Dist[N]);
    124     return 0;
    125 }
    View Code
  • 相关阅读:
    [VBS]遍历XML文档
    [VBS]带参数删除扩展名不是*.h、*.c、*.cpp的全部文件
    [VBS]脚本中的字典、动态数组、队列和堆栈
    [VBS]检测计算机各硬件信息
    [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小
    VB.NET and C# 差异
    host-only局域网络
    高并发、死锁、幂等性问题
    elasticsearch简单实现
    记一次504 Gateway Time-out
  • 原文地址:https://www.cnblogs.com/CQBZOIer-zyy/p/3827220.html
Copyright © 2011-2022 走看看