最短路径问题

【题目描述】:

平面上有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\n",d[t]);
75     //while (1);
76     return 0;
77 }

 

posted @ 2019-07-02 13:03  Sword_Art_Online  阅读(334)  评论(0编辑  收藏  举报