2602 最短路径问题Dihstra算法

题目描述 Description

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

输入描述 Input Description

第一行为整数n。

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

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

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

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

输出描述 Output Description

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

样例输入 Sample Input

5

0 0

2 0

2 2

0 2

3 1

5

1 2

1 3

1 4

2 5

3 5

1 5

样例输出 Sample Output

3.41

数据范围及提示 Data Size & Hint

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 double db_maxn=127;
 7 double maxn=127;
 8 struct node
 9 {
10     double x;
11     double y;
12 }a[1001];
13 double dis[1001];
14 int vis[1001];
15 int n;
16 double map[101][101];
17 void Dijkstra(int u)
18 {
19     memset(vis,0,sizeof(vis));
20     for(int i=1;i<=n;i++)
21     {
22         dis[i]=map[u][i];
23     }
24     dis[u]=0;
25     vis[u]=1;
26     for(int i=1;i<n;i++)
27     {
28         double minn=99999999;
29         int k=-1;
30         for(int j=1;j<=n;j++)
31         {
32             if((dis[j]<=minn)&&vis[j]==0)
33             {
34                 minn=dis[j];
35                 k=j;
36             }
37         }
38         vis[k]=1;
39         for(int j=1;j<=n;j++)
40         {
41             if((dis[j]>=dis[k]+map[k][j])&&vis[j]==0)
42             dis[j]=dis[k]+map[k][j];
43         }
44     }
45 }
46 int main()
47 {
48     memset(map,db_maxn,sizeof(map));
49     memset(dis,db_maxn,sizeof(dis));
50     scanf("%d",&n);
51     for(int i=1;i<=n;i++)
52     {
53         scanf("%lf%lf",&a[i].x,&a[i].y);
54         //a[i].cd=sqrt((pow(abs(x),2))+(pow(abs(y),2)));
55     }
56     int m;
57     scanf("%d",&m);
58     for(int i=1;i<=m;i++)
59     {
60         int p,q;
61         scanf("%d%d",&p,&q);
62         double y=sqrt(pow(a[p].x-a[q].x,2)+pow(a[p].y-a[q].y,2));
63         map[p][q]=y;
64         map[q][p]=y;
65     }
66     int u,v;
67     scanf("%d%d",&u,&v);
68     Dijkstra(u);
69     printf("%0.2lf",dis[v]);
70     return 0;
71 }
时间: 2024-10-13 03:14:25

2602 最短路径问题Dihstra算法的相关文章

2602 最短路径问题

2602 最短路径问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线.若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离.现在的任务是找出从一点到另一点之间的最短路径. 输入描述 Input Description 第一行为整数n. 第2行到第n+1行(共n行),每行两个整数x和y,描述了

最短路径之Dijkstra算法

Dijkstra算法: 首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的的长度:如D[3]=2表示从始点v到终点3的路径相对最小长度为2.这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于长度.它的初始状态为:若从v到vi有弧,则D为弧上的权值:否则置D为∞.显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条.此路径为(v,vj). 那么,下一条长度次短的是哪一条呢?假设该次短路径的终点是vk,

图的单源最短路径:Dijkstra算法实现

本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法. 算法核心思想参见维基.简而言之,设集合S存放已经求出了最短路径的点.初始状态S中只有一个点v0,之后每求得v0到vn的最短路径,就会更新v0到所有vn邻接的点的一致的最短路径(不一定是最终的最短路径),如此重复,每次会确定v0到一个点的最短路径,确定好的点加入S中,直至所有点进入S结束.在本文中

单源最短路径(dijkstra算法)php实现

做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi...Vk)也必定是从i到k的最短路径.Dijkstra是以最短路径长度递增,逐次生成最短路径的算法.例如:对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+cost[i][j]}.假设G

hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7062    Accepted Submission(s): 2301 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU1535——Invitation Cards(最短路径:SPAF算法)

Invitation Cards DescriptionIn the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitatio

HDU1548——A strange lift(最短路径:dijskstra算法)

A strange lift DescriptionThere is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "U

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 之前已经对Dijkstra算法做了介绍(不懂的可以看这篇博客:Dijkstra算法详解),所以这篇博客打算对Floyd算法做

HDU 1217 Arbitrage(最短路径,Floyd算法)

Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys