zoukankan      html  css  js  c++  java
  • poj2502 最短路

    题意:一个人要从家到学校,步行速度10km/h,图上有地铁40km/h,地铁有不同线路,每个线路上的地铁可以互通,相邻两站之间地铁以直线运行,不同地铁线路之间不能直接通过地铁乘坐到达,但不同地点间可以直接步行,按直线走。给出家、学校、各地铁站台的坐标(单位 m),问从家到学校最短需要花费多少时间(min)

    坑爹的单位…… km/h、m、min,然后需要注意地铁线路的建边需要一站一站建,因为只有相邻两站间才以直线运行,但同一条地铁线路并不一定建成一条直线。剩余没有连通的点对之间用步行相连,建完图之后用最短路就能计算了。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<queue>
     4 #include<vector>
     5 #include<algorithm>
     6 #include<math.h>
     7 #include<map>
     8 using namespace std;
     9 typedef pair<double,int> pii;
    10 const double INF=1e9;
    11 
    12 struct point{
    13     int x,y;
    14     bool operator < (const point a)const{
    15         if(x==a.x)return y<a.y;
    16         return x<a.x;
    17     }
    18     point(int a,int b):x(a),y(b){}
    19 };
    20 
    21 int cnt;
    22 double ma[205][205];
    23 int vis[205][205];
    24 double d[205];
    25 int line[205],x[205],y[205];
    26 int cl;
    27 
    28 struct cmp{
    29     bool operator()(pii a,pii b){
    30         return a.first>b.first;
    31     }
    32 };
    33 
    34 double cal(int a,int b){
    35     return sqrt(1.0*(x[a]-x[b])*(x[a]-x[b])+1.0*(y[a]-y[b])*(y[a]-y[b]));
    36 }
    37 
    38 void dij(){
    39     int i;
    40     priority_queue<pii,vector<pii>,cmp>q;
    41     q.push(make_pair(0,1));
    42     for(i=1;i<=cnt;++i)d[i]=INF;
    43     d[1]=0;
    44     while(!q.empty()){
    45         pii u=q.top();
    46         q.pop();
    47         if(u.first>d[u.second])continue;
    48         if(u.second==2){printf("%d
    ",(int)(d[2]/60.0+0.5));break;}
    49         for(int j=2;j<=cnt;++j){
    50             if(j==u.second)continue;
    51             double v=ma[u.second][j];
    52             if(d[j]>u.first+v){
    53                 d[j]=u.first+v;
    54                 q.push(make_pair(d[j],j));
    55             }
    56         }
    57     }
    58 }
    59 
    60 int main(){
    61     cnt=0;
    62     scanf("%d%d",&x[1],&y[1]);
    63     scanf("%d%d",&x[2],&y[2]);
    64     map<point,int>m;
    65     m[point(x[1],y[1])]=++cnt;
    66     m[point(x[2],y[2])]=++cnt;
    67     int x1,y1;
    68     cl=0;
    69     while(scanf("%d%d",&x1,&y1)!=EOF){
    70         if(x1==-1&&y1==-1){
    71             for(int i=2;i<=cl;++i){
    72                 int j=i-1;
    73                 ma[line[j]][line[i]]=ma[line[i]][line[j]]=cal(line[i],line[j])/40.0*3.6;
    74                 vis[line[i]][line[j]]=vis[line[j]][line[i]]=1;
    75             }
    76             cl=0;
    77         }
    78         else{
    79             point tmp(x1,y1);
    80             if(m[tmp])line[++cl]=m[tmp];
    81             else{
    82                 line[++cl]=m[tmp]=++cnt;
    83                 x[cnt]=x1;y[cnt]=y1;
    84             }
    85         }
    86     }
    87     for(int i=1;i<=cnt;++i){
    88         for(int j=i+1;j<=cnt;++j){
    89             if(!vis[i][j])ma[i][j]=ma[j][i]=cal(i,j)/10.0*3.6;
    90         }
    91     }
    92     dij();
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    第十章 迭代器模式 Iterator
    第四章:使用Proxy代理让客户端服务端分工合作。
    第三章:真正弄清楚一个Mod的组织结构
    第二章:开始开发mod前你需要知道的一些事情
    第一章:在IDEA里搭建基于Forge的Minecraft mod开发环境
    Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
    关于坑爹的PopupWindow的“阻塞”争议问题:Android没有真正的“阻塞式”对话框
    快排-Go版本
    链表翻转(按K个一组)(Go语言)
    牛客刷题-重建二叉树(GO语言版)
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4785322.html
Copyright © 2011-2022 走看看