poj 2502 Subway
来源:互联网 发布:最新通达信软件 编辑:程序博客网 时间:2024/06/05 03:59
本题一个卡人的地方在于如何表示结束输入,可采用while(scanf() == 2),但结束输入时, scanf返回值是0,循环跳出
另外一点, 题目中说地铁中任意两个相邻的地铁站可看成直线,在计算 非相邻地铁之间的时间是,速度是10km/h,两个相邻的地铁之间的速度是40km/h,在这里错了很久
#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const double inf = 99999999;double dis[210], cost[210][210];bool vis[210];int k;typedef struct { int x; int y;}point;point p[210];double getdis(int i, int j){ int a = p[i].x - p[j].x; int b = p[i].y - p[j].y; return sqrt(1.0*a*a + 1.0*b*b);}void init(){ for(int i=1; i<k; i++) { dis[i] = i==1 ? 0 : inf; vis[i] = 0; }}void dijkstra(){ double m; int i, j; while(1) { m = inf; for(i=1; i<k; i++) if(!vis[i] && dis[i] < m) m = dis[j = i]; vis[j] = 1; if(j == 2) break; for(i=1; i<k; i++) if(!vis[i]) dis[i] = min(dis[i], dis[j]+cost[j][i]); } printf("%d\n", (int)(dis[2]+0.5));}int main(){ scanf("%d %d %d %d", &p[1].x, &p[1].y, &p[2].x, &p[2].y); int flag = 0; k = 3; while(scanf("%d %d", &p[k].x, &p[k].y) == 2) { if(p[k].x==-1 && p[k].y==-1) { flag = 0; continue; } if(flag) { double d = getdis(k, k-1); cost[k-1][k] = cost[k][k-1] = 3*d/2000; } flag = 1; k++; } for(int i=1; i<k; i++) for(int j=i-1; j<k; j++) if(cost[i][j] == 0 || cost[j][i] == 0) { double d = getdis(i, j); cost[i][j] = cost[j][i] = 3*d/500; } init(); dijkstra(); return 0;}
- POJ 2502 Subway
- poj 2502 Subway
- poj 2502Subway flody
- POJ-2502-Subway
- poj 2502 Subway
- POJ 2502 Subway
- POJ 2502 Subway
- POJ 2502 Subway
- Dijkstra-POJ-2502-Subway
- POJ 2502 Subway
- POJ 2502 - Subway
- poj 2502 Subway
- POJ 2502 Subway
- poj 2502 Subway
- poj 2502 Subway 【spfa】
- POJ 2502 Subway 笔记
- POJ-2502 Subway
- POJ 2502 Subway(最短路)
- opencv学习(6)---仿射变换
- 念数字
- hdu 2688 Rotate (树状数组)
- C#中从数据库导出至txt
- 通过memcached来实现对tomcat集群中Session的共享策略
- poj 2502 Subway
- c++11简单介绍
- 迟来的毕业答辩再现
- 线性代数导论7——求解Ax=0:主变量、特解
- C# TXT文件导入至数据库
- 13年多校总结
- 和模板阴影有关的边缘检测
- C++中string 结束判断
- bb \w\h\u