zoukankan      html  css  js  c++  java
  • poj 2502(floyd)

    题意: 从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。

    注意三点地方:

           一、每两点可达,即使没有地铁,也可以步行的;

           二、相邻地铁可达,不相邻不用管(即在同一条地铁线上的两个不相邻站台不用管);

           三、地铁线不一定是直的。(WA了好两次)

    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 using namespace std;
     5 #define inf 0x7ffffff
     6 #define eps 1e-8
     7 #define MIN(x,y) ((x)>(y)?(y):(x))
     8 
     9 int V;
    10 struct node
    11 {
    12     double x,y;
    13 }pos[210];
    14 
    15 double dis[210][210];//i->j最短时间
    16 
    17 void floyd()
    18 {
    19     for(int k=0;k<V;k++) 
    20         for(int i=0;i<V;i++)
    21             for(int j=0;j<V;j++)
    22                 dis[i][j]=MIN(dis[i][j],dis[i][k]+dis[k][j]);
    23 }
    24 
    25 double subwaydis(node a,node b)
    26 {
    27     double d=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
    28     return d/40.0;
    29 }
    30 
    31 double walkway(node a,node b)
    32 {
    33     double d=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
    34     return d/10.0;
    35 }
    36 int main()
    37 {
    38     int x,y;
    39     scanf("%d%d",&x,&y);
    40     V=0;
    41     pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
    42     scanf("%d%d",&x,&y);
    43     pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
    44     for(int i=0;i<210;i++)
    45         for(int j=0;j<210;j++)
    46             if(i==j)
    47                 dis[i][j]=0;
    48             else
    49                 dis[i][j]=dis[j][i]=inf;
    50 
    51     while(scanf("%d%d",&x,&y) != EOF)
    52     {
    53         int st=V;
    54         while(x!=-1 && y!=-1)
    55         {
    56             pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
    57             scanf("%d%d",&x,&y);
    58         }
    59 
    60         for(int i=st;i<V-1;i++)
    61                 dis[i][i+1]=dis[i+1][i]=subwaydis(pos[i],pos[i+1]);
    62     }
    63     //cout<<V<<endl;
    64     //for(int i=0;i<V;i++)
    65     //    for(int j=0;j<V;j++)
    66     //        cout<<"i="<<i<<" j="<<j<<" "<<dis[i][j]<<endl;
    67     
    68     for(int i=0;i<V;i++)
    69         for(int j=0;j<V;j++)
    70             if(fabs(dis[i][j]-inf)<=eps)
    71                 dis[i][j]=walkway(pos[i],pos[j]);
    72     floyd();
    73     double ans=(dis[0][1]*60.0);
    74     printf("%.0lf\n",(ans));
    75     return 0;
    76 }

     

  • 相关阅读:
    mapreduce 本地调试需要注意的问题
    socket-----爬虫&&文件传输
    多个地点ping服务器
    linux grep命令详解
    关于真多核和加多核&线程由哪几部分组成
    内存溢出和内存泄漏
    指针和引用的区别
    Doxygen的使用,配置及实例
    【转】doxygen+graphviz生成工程中的类继承树及函数调用图
    转载--void指针(void *的用法)
  • 原文地址:https://www.cnblogs.com/Missa/p/2661095.html
Copyright © 2011-2022 走看看