poj2502 最短路

  1 //Accepted    504 KB    16 ms
  2 //spfa最短路
  3 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间
  4 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了
  5 #include <cstdio>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <queue>
  9 #include <cmath>
 10 #include <algorithm>
 11 using namespace std;
 12 /**
 13   * This is a documentation comment block
 14   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
 15   * @authr songt
 16   */
 17 const int imax_n = 205;
 18 const double inf = 1000000000000000000.0;
 19 double x[imax_n];
 20 double y[imax_n];
 21 double a[imax_n][imax_n];
 22 double dis[imax_n];
 23 bool vis[imax_n];
 24 int n;
 25 double getDis(double x1,double y1,double x2,double y2)
 26 {
 27     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
 28 }
 29 void init()
 30 {
 31     for (int i=1;i<=n;i++)
 32     {
 33         for (int j=1;j<=n;j++)
 34         {
 35             if (fabs(a[i][j])<1e-9)
 36             {
 37                 a[i][j]=getDis(x[i],y[i],x[j],y[j])*3.0/500;
 38                 //printf("%d %d ==> %d %d\n",x[i],y[i],x[j],y[j]);
 39             }
 40         }
 41     }
 42 }
 43 bool relax(int u,int v,double c)
 44 {
 45     if (dis[v]-dis[u]-c>1e-9)
 46     {
 47         dis[v]=dis[u]+c;
 48         return true;
 49     }
 50     return false;
 51 }
 52 queue<int > q;
 53 bool spfa(int src)
 54 {
 55     while (!q.empty()) q.pop();
 56     for (int i=1;i<=n;i++)
 57     dis[i]=inf;
 58     dis[src]=0;
 59     memset(vis,0,sizeof(vis));
 60     q.push(src);
 61     vis[src]=true;
 62     while (!q.empty())
 63     {
 64         int pre=q.front();
 65         q.pop();
 66         vis[pre]=false;
 67         for (int i=1;i<=n;i++)
 68         if (relax(pre,i,a[pre][i]) && !vis[i])
 69         {
 70             vis[i]=true;
 71             q.push(i);
 72         }
 73     }
 74 }
 75 int main()
 76 {
 77     scanf("%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2]);
 78     n=2;
 79     double ca,cb;
 80     int start,end;
 81     int flag=0;
 82     for (int i=1;i<imax_n;i++)
 83     {
 84         for (int j=1;j<imax_n;j++)
 85         a[i][j]=0.0;
 86     }
 87     while (scanf("%lf%lf",&ca,&cb)!=EOF)
 88     {
 89         if (ca==-1 && cb==-1)
 90         {
 91             end=n;
 92             for (int i=start;i<end;i++)
 93             {
 94                     a[i][i+1]=a[i+1][i]=getDis(x[i],y[i],x[i+1],y[i+1])*3.0/2000;
 95                     //printf("%d %d ==> %d %d\n",x[i],y[i],x[j],y[j]);
 96             }
 97             flag=0;
 98             continue;
 99         }
100         ++n;
101         x[n]=ca;
102         y[n]=cb;
103         if (flag==0)
104         {
105             start=n;
106             flag=1;
107         }
108     }
109     init();
110     spfa(1);
111     printf("%.0f\n",dis[2]);
112     return 0;
113 }

时间: 2024-10-10 18:29:59

poj2502 最短路的相关文章

poj2502(最短路)

题目连接:http://poj.org/problem?id=2502 用模拟栈试试... 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<stack> //用了模拟栈 5 using namespace std; 6 const int maxn=210; 7 const int inf=0x3f3f3f3f; 8 double x[maxn],y[maxn],dis[

poj2502题解(建图+最短路)

题意 给起点和终点的坐标,然后给出多条地铁每一站的坐标,每站地铁只能到相邻的地铁站,地铁的速度是40km/h,人行走的速度是10km/h,求起点到终点的最小时间(给出的坐标单位是m,最后求的时间单位是分钟) 解题思路 这题关键点在与建图,把图建好后跑dijkstra就很简单了,之前一直wa是想复杂了,以为要考虑起点和终点在地铁站的情况和不同线路的地铁站相交的情况,后来想不需要这么麻烦,同一条线路相邻的40,不同的10就可以了,相交的话,以10km/h走时间花费是0. AC代码 #include<

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是