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
题目大意:首先给你两个坐标,一个是你家里的坐标,一个是你学校的坐标,然后接下来有若干条地铁线,每条地铁线上有若干个站点,给出每个站点的坐标,有这些点,这些点当中有距离,这个距离的单位是米,现在告诉你走路是10km/h,做地铁的话是40km/h,问你从家里到学校所花费的最短时间(分钟)
思路:这道题主要是考建边,对于地铁方式每相邻两个站建一条边,对于步行方式每两个站都可以建一条边,建边用时间作为权值
#include<cstdio> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<string.h> #include<iostream> #include<cmath> #include<stdlib.h> #define N 310 #define INF 0x7fffffff using namespace std; struct edge { double x,y; }team[N]; int visit[N],n; double mpt[N][N],dis[N]; double Dis(int a,int b) { double x = team[a].x - team[b].x; double y = team[a].y - team[b].y; return sqrt(x*x+y*y); } void Add_edge(int a,int b,double t) { if(mpt[a][b] > t) mpt[a][b] = t; if(mpt[b][a] > t) mpt[b][a] = t; } void Dijkstra() { for(int i = 1 ; i <= n ; i ++) dis[i] = mpt[1][i]; memset(visit,0,sizeof(visit)); visit[1] = 1; int i,j,Min,Minj; for(i = 0 ; i < n ; i ++) { Min = INF;Minj = -1; for(j = 1 ; j <= n ; j ++) { if(visit[j])continue; if(dis[j] < Min) { Min = dis[j]; Minj = j; } } if(Minj == -1) break; visit[Minj] = 1; for(j = 1; j <= n ; j ++) { if(dis[j] > dis[Minj] + mpt[Minj][j]) dis[j] = dis[Minj] + mpt[Minj][j]; } } } int main() { int i,j,k,m; double x,y; double v1=10000.0/60; //步行 double v2=40000.0/60; //地铁 n = 2;m = 3; for(i = 0 ; i < N ; i ++) { for( j = 0 ; j < N ; j ++) { if(i == j) mpt[i][j] = 0; else mpt[i][j] = INF; } } scanf("%lf %lf %lf %lf",&team[1].x,&team[1].y,&team[2].x,&team[2].y); while(scanf("%lf %lf",&x,&y)!=EOF) { if( x == -1 && y == -1 ) { m = n + 1; continue; } n++; team[n].x = x;team[n].y = y; if( m != n) { Add_edge(n-1,n,Dis(n-1,n)/v2); } } for(i = 1; i <= n; i ++) { for(j = i + 1; j <= n ; j ++) { Add_edge(i,j,Dis(i,j)/v1); } } Dijkstra(); printf("%d\n",(int)(dis[2]+0.5)); }