• 1205. By the Underground or by Foot?(spfa)


    1205

    简单题 有一些小细节 两个站可能不相连 但是可以走过去

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 #include<vector>
      7 #include<queue>
      8 #include<cmath>
      9 using namespace std;
     10 #define INF 0xfffffff
     11 vector<int>ed[310];
     12 double v1,v2,x[310],y[310],w[210][210],dis[210];
     13 int n,vis[210],pa[210],o[210];
     14 void spfa(int s,int e)
     15 {
     16     int i;
     17     for(i =0 ; i <= n ; i++)
     18     dis[i] = INF;
     19     dis[s] = 0;
     20     queue<int>q;
     21     vis[s] = 1;
     22     q.push(s);
     23     while(!q.empty())
     24     {
     25         int u  = q.front();
     26         q.pop();
     27         vis[u] = 0;
     28         for(i = 0 ; i < (int)ed[u].size() ; i++)
     29         {
     30             int v = ed[u][i];
     31             if(dis[v]>dis[u]+w[u][v])
     32             {
     33                 pa[v] = u;
     34                 dis[v] = dis[u]+w[u][v];
     35                 if(!vis[v])
     36                 {
     37                     vis[v] = 1;
     38                     q.push(v);
     39                 }
     40             }
     41         }
     42     }
     43     printf("%.7lf
    ",dis[e]);
     44     int g = 0,x=e;
     45     while(pa[x]!=s)
     46     {
     47         x = pa[x];
     48         g++;
     49         o[g] = x;
     50     }
     51     printf("%d",g);
     52     for(i = g ; i>=1 ; i--)
     53     printf(" %d",o[i]);
     54     puts("");
     55 }
     56 double dist(int u,int v)
     57 {
     58     double s = sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
     59     return s;
     60 }
     61 int main()
     62 {
     63     int i,j,u,v;
     64     cin>>v1>>v2;
     65     cin>>n;
     66     for(i = 1; i <= n ;i++)
     67     {
     68         scanf("%lf%lf",&x[i],&y[i]);
     69     }
     70     for(i = 0 ;i <= n+1 ; i++)
     71         for(j = 0  ; j <= n+1 ; j++)
     72         w[i][j] = INF;
     73     while(scanf("%d%d",&u,&v)!=EOF)
     74     {
     75         if(!u&&!v)
     76         break;
     77         w[u][v] = dist(u,v)/v2;
     78         w[v][u] = w[u][v];
     79         ed[u].push_back(v);
     80         ed[v].push_back(u);
     81     }
     82     for(i = 1; i <= n ; i++)
     83         for(j = i+1 ;j <= n ;j++)
     84         {
     85             if(w[i][j]==INF)
     86             {
     87                 w[i][j] = dist(i,j)/v1;
     88                 w[j][i] = w[i][j]/v1;
     89                 ed[i].push_back(j);
     90                 ed[j].push_back(i);
     91             }
     92         }
     93     scanf("%lf%lf%lf%lf",&x[0],&y[0],&x[n+1],&y[n+1]);
     94     for(i = 1; i <= n+1 ;i++)
     95     {
     96         w[0][i] = dist(i,0)/v1;
     97         w[i][0] = w[0][i];
     98         ed[0].push_back(i);
     99         ed[i].push_back(0);
    100         w[n+1][i] = dist(i,n+1)/v1;
    101         w[i][n+1] = w[n+1][i];
    102         ed[i].push_back(n+1);
    103         ed[n+1].push_back(i);
    104     }
    105     n++;
    106     for(i = 0; i <= n ;i++)
    107     w[i][i] = 0;
    108     spfa(0,n);
    109     return 0;
    110 }
    View Code
  • 相关阅读:
    Android获取实时连接热点的设备IP地址
    CentOS7打开关闭防火墙与端口
    Nginx的反向代理和负载均衡
    Linux系统(centos7)中Nginx安装、配置和开机自启
    navicat for oracle 创建表ID字段的自动递增
    Java初学者的学习路线建议
    分享一些JAVA常用的学习网站
    ThinkPHP框架
    PHP中的session
    PHP中的Cookie
  • 原文地址:https://www.cnblogs.com/shangyu/p/3353792.html
Copyright © 2020-2023  润新知