7-14 天梯地图(30 分)

来源:互联网 发布:淘宝怎么去同款 编辑:程序博客网 时间:2024/05/21 00:00

本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线;一条是最短距离的路线。题目保证对任意的查询请求,地图上都至少存在一条可达路线。

输入格式:

输入在第一行给出两个正整数N(2  N  500)和M,分别为地图中所有标记地点的个数和连接地点的道路条数。随后M行,每行按如下格式给出一条道路的信息:

V1 V2 one-way length time

其中V1V2是道路的两个端点的编号(从0到N-1);如果该道路是从V1V2的单行线,则one-way为1,否则为0;length是道路的长度;time是通过该路所需要的时间。最后给出一对起点和终点的编号。

输出格式:

首先按下列格式输出最快到达的时间T和用节点编号表示的路线:

Time = T: 起点 => 节点1 => ... => 终点

然后在下一行按下列格式输出最短距离D和用节点编号表示的路线:

Distance = D: 起点 => 节点1 => ... => 终点

如果最快到达路线不唯一,则输出几条最快路线中最短的那条,题目保证这条路线是唯一的。而如果最短距离的路线不唯一,则输出途径节点数最少的那条,题目保证这条路线是唯一的。

如果这两条路线是完全一样的,则按下列格式输出:

Time = T; Distance = D: 起点 => 节点1 => ... => 终点

输入样例1:

10 150 1 0 1 18 0 0 1 14 8 1 1 15 4 0 2 35 9 1 1 40 6 0 1 17 3 1 1 28 3 1 1 22 5 0 2 22 1 1 1 11 5 0 1 31 4 0 1 19 7 1 1 33 1 0 2 56 3 1 2 15 3

输出样例1:

Time = 6: 5 => 4 => 8 => 3Distance = 3: 5 => 1 => 3

输入样例2:

7 90 4 1 1 11 6 1 3 12 6 1 1 12 5 1 2 23 0 0 1 13 1 1 3 13 2 1 2 14 5 0 2 26 5 1 2 13 5

输出样例2:

Time = 3; Distance = 4: 3 => 2 => 5
我的代码:

#include<iostream>#include<stack>#include<memory.h>using namespace std;int f1[501],f2[501],ti[501][501],co[501][501];int x,y,z,d,t,cnt[501],vis[501],s,e,n,m,i,j;void min1(int s){int i,j;vis[s]=1;for(i=0;i<n;i++){int k=-1,min=999999;for(j=0;j<n;j++){if(vis[j]==0 && co[s][j]<min){min=co[s][j];k=j;}}if(k==-1) break;vis[k]=1;for(j=0;j<n;j++){if(vis[j]==0 && co[s][j]>co[s][k]+co[k][j]){f1[j]=k;co[s][j]=co[s][k]+co[k][j];cnt[j]=cnt[k]+1;}else if(vis[j]==0 && co[s][j]==co[s][k]+co[k][j] && cnt[j]>cnt[k]+1){f1[j]=k;cnt[j]=cnt[k]+1;}}}}void min2(int s){int i,j;vis[s]=1;for(i=0;i<n;i++){int k=-1,min=999999;for(j=0;j<n;j++){if(vis[j]==0 && ti[s][j]<min){min=ti[s][j];k=j;}}if(k==-1) break;vis[k]=1;for(j=0;j<n;j++){if(vis[j]==0 && ti[s][j]>ti[s][k]+ti[k][j]){f2[j]=k;ti[s][j]=ti[s][k]+ti[k][j];co[s][j]=co[s][k]+co[k][j];}else if(vis[j]==0 && ti[s][j]==ti[s][k]+ti[k][j] && co[s][j]>co[s][k]+co[k][j]){f2[j]=k;co[s][j]=co[s][k]+co[k][j];}}}}int main(){scanf("%d%d",&n,&m);for(i=0;i<n;i++){cnt[i]=1;for(j=0;j<n;j++){ti[i][j]=ti[j][i]=999999;co[i][j]=co[j][i]=999999;}}for(i=0;i<m;i++){scanf("%d%d%d%d%d",&x,&y,&z,&d,&t);if(z==1){ti[x][y]=t;co[x][y]=d;}else{ti[x][y]=ti[y][x]=t;co[x][y]=co[y][x]=d;}}scanf("%d%d",&s,&e);min1(s);int k1=e,k2=e,len=co[s][e];stack<int>ss1,ss2;ss1.push(k1);while(f1[k1]!=0){ss1.push(f1[k1]);k1=f1[k1];}memset(vis,0,sizeof(vis));min2(s);ss2.push(k2);while(f2[k2]!=0){ss2.push(f2[k2]);k2=f2[k2];}if(ss1==ss2){printf("Time = %d; Distance = %d: %d",ti[s][e],len,s);while(!ss1.empty()){printf(" => %d",ss1.top());ss1.pop();}}else{printf("Time = %d: %d",ti[s][e],s);while(!ss2.empty()){printf(" => %d",ss2.top());ss2.pop();}puts("");printf("Distance = %d: %d",len,s);while(!ss1.empty()){printf(" => %d",ss1.top());ss1.pop();}}return 0;}

原创粉丝点击