• 最短路径问题


    【题目描述】:

    平面上有n个点,每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。

    【输入描述】:

    输入文件共n+m+3行,其中:第一行为整数n。

    第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标。

    第n+2行为一个整数m,表示图中连线的个数。

    此后的m 行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。

    最后一行:两个整数s和t,分别表示源点和目标点

    【输出描述】:

    输出文件仅一行,一个实数(保留5位小数),表示从s到t的最短路径长度。

    【样例输入】:

    5
    0 0
    2 0
    2 2
    0 2
    3 1
    5 
    1 2 
    1 3 
    1 4 
    2 5 
    3 5 
    1 5

    【样例输出】:

    3.41421

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    n<=100

    分析:

    该题实际上就是最短路模板,只不过边权需要自己求,同时注意用double类型即可。

    CODE:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 #include<cmath>
     6 using namespace std;
     7 const int M=500005*2;
     8 const int oo=1<<30;
     9 queue<int> q;
    10 int n,m,s,t;
    11 int tot;
    12 int next[M],head[M],to[M];
    13 double adj[M];
    14 bool f[M];
    15 double d[M];
    16 inline int get(){
    17     int f=1;
    18     char c=getchar();
    19     int res=0;
    20     while (c<'0'||c>'9') {
    21         if (c=='-') f=-1;
    22         c=getchar();
    23     }
    24     while (c>='0'&&c<='9'){
    25         res=(res<<3)+(res<<1)+c-'0';
    26         c=getchar();
    27     }
    28     return res*f;
    29 }
    30 void add(int u,int v,double w){
    31     next[++tot]=head[u];
    32     head[u]=tot;
    33     adj[tot]=w;
    34     to[tot]=v;
    35     return ;
    36 }
    37 void spfa(){
    38     q.push(s);
    39     d[s]=0;
    40     f[s]=true;
    41     int u;
    42     while (!q.empty()){
    43         u=q.front();
    44         q.pop();
    45         f[u]=false;
    46         for (int j=head[u];j;j=next[j]){
    47             if (d[to[j]]>d[u]+adj[j]){
    48                 d[to[j]]=d[u]+adj[j];
    49                 if (!f[to[j]]){
    50                 q.push(to[j]);
    51                 f[to[j]]=true;
    52                 }
    53             }
    54         }
    55     }
    56     return ;
    57 }
    58 double x[M],y[M];
    59 int main(){
    60     n=get();
    61     for (int i=1;i<=n;i++) d[i]=oo;
    62     for (int i=1;i<=n;i++) x[i]=get(),y[i]=get();
    63     m=get();
    64     for (int i=1;i<=m;i++){
    65         int u,v;
    66         u=get(),v=get();
    67         double w=sqrt((x[u]-x[v])*(x[u]-x[v])+(y[u]-y[v])*(y[u]-y[v]));
    68         add(u,v,w);
    69         add(v,u,w);
    70     }
    71     memset(f,false,sizeof(f));
    72     s=get(),t=get();
    73     spfa();
    74     printf ("%.5f
    ",d[t]);
    75     //while (1);
    76     return 0;
    77 }
  • 相关阅读:
    servlet中Cookie的编码问题
    servlet关于转发用法
    eclipse界面更改为黑色
    猜字符小游戏——可以设置等级
    uva 10655
    uva11029
    UVA11388 GCD LCM1 2 -1
    uva 11609
    poj 2436
    poj 2431
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11120012.html
Copyright © 2020-2023  润新知