Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 4593 | Accepted: 1497 |
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
//这题就是给你出发点和终点的坐标,然后要你求出怎么样用最短的时间从起点到终点,给出的是subway的坐标。最后的输入是以EOF结束。我们要考虑的就是要是相邻的两个subway就用subwaydis,要不是相邻的话, 就要考虑用步行,也就是walkdis
然后计算最短路的时候是调用flody
代码如下:
#include<cstdio> #include<string> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; #define d double const int maxn=210; const int inf=1<<29; double map[maxn][maxn]; int n; struct point{ int x,y; }s[maxn]; double wal(int i,int j){ d length=sqrt(((d)s[i].x-(d)s[j].x)*((d)s[i].x-(d)s[j].x)+((d)s[i].y-(d)s[j].y)*((d)s[i].y-(d)s[j].y)); return 60*length/10000 ; } double sub(int i,int j){ d length=sqrt(((d)s[i].x-(d)s[j].x)*((d)s[i].x-(d)s[j].x)+((d)s[i].y-(d)s[j].y)*((d)s[i].y-(d)s[j].y)); return 60*length/40000; } void flody(){ for(int k=1;k<=n;k++){ for (int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } } int main(){ scanf("%d%d%d%d",&s[1].x,&s[1].y,&s[2].x,&s[2].y); map[1][2]=map[2][1]=wal(1,2); n=3; int j=0,a,b ; while(scanf("%d%d",&a,&b)!=EOF){ if(a==-1&&b==-1) j=0; else{ s[n].x=a,s[n].y=b; for(int i=1;i<n-j;i++){ map[i][n]=map[n][i]=wal(i,n); } for(int i=n-j;i<n;i++){ map[i][n]=map[n][i]=sub(i,n); } j=1,n++; } } n--; flody(); printf("%.0f\n",map[1][2]); return 0; }