Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7482 | Accepted: 2433 |
Description
Input
Output
Sample Input
0 0 10000 1000 0 200 5000 200 7000 200 -1 -1 2000 600 5000 600 10000 600 -1 -1
Sample Output
21
告诉一些地铁线路,从起点到终点,中途可以步行,可以坐地铁,找一条最短的路
主要是把图建立好,然后直接dijkstra或者floyd,因为速度不同,所以转化成求最短的时间
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define INF 1<<30 double mp[500][500]; int subway[500]; int n; struct node { double x,y; }f[500]; double dis(node a,node b) { return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); } int check(node a) { int i; for(i=1;i<n;i++) { if(a.x==f[i].x && a.y==f[i].y) break; } if(i==n) f[n++]=a; return i; } void floyd() { for(int k=1;k<n;k++) { for(int i=1;i<n;i++) { for(int j=1;j<n;j++) { mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } } } } int main() { node a; n=1; for(int i=0;i<=333;i++) { for(int j=0;j<=333;j++) { if(i==j) mp[i][j]=0; else mp[i][j]=INF; } } scanf("%lf%lf%lf%lf",&f[n].x,&f[n].y,&f[n+1].x,&f[n+1].y); int cnt; n+=2; while(~scanf("%lf%lf",&a.x,&a.y)) { cnt=0; subway[cnt++]=check(a); while(scanf("%lf%lf",&a.x,&a.y) && (a.x!=-1 && a.y!=-1) ) { subway[cnt++]=check(a); } for(int i=1;i<cnt;i++) { mp[subway[i]][subway[i-1]]=mp[subway[i-1]][subway[i]]=dis( f[subway[i]],f[subway[i-1]] )*3.0/2000.0; } } for(int i=1;i<n;i++) { for(int j=1;j<i;j++) { mp[i][j]=mp[j][i]=min( mp[i][j], dis(f[i],f[j])*3.0/500.0 ); } } floyd(); printf("%d\n",(int)(mp[1][2]+0.5)); return 0; }