78.圣诞广场 (15分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
Angel最近无聊,去了圣诞岛(CX *^_^*),他喜欢无目的的乱逛,当然,他不会轻易地回头。Angel想
去广场,那么,他什么时候才能到呢?你已经得到了CX的地图,地图上有N(N <= 100)个交叉路口,交
叉路口之间有马路相连接(不超过1000条马路)。因为CX的人遵循奇怪的规则,道路都是单向的,不同
的道路之间有一定的距离,我们假设Angel所在的地点为点1,广场所在点为N。假设Angel走一单位距
离需要一单位时间。问Angel最早和最迟什么时候到达广场?
输入描述
本题有多组数据,第一行N, M,M是边的数量,以后M行,每行3个整数X, Y, Weight,代表一条从X
城市到Y城市,长度为Wweight的边。
输出描述
每组数据,第一行是最少时间,第二行是最迟时间,要是可怜的Angel可能永远到不了广场,输
出一行Never。
输入样例
5 5
1 2 1
1 4 10
2 3 1
3 4 1
4 5 1
输出样例
4
11
思路:
这道题用的是任意两点间的最短路Floyd-Warshall算法思想,算是直接用板子
代码:
#include<iostream> #include<stdio.h> using namespace std; const int maxn = 1e3+10; #define Inf 0x3f3f3f3f int a[maxn][maxn]; int b[maxn][maxn]; int main(){ int n,m; cin>>n>>m; int x,y,w; for(int i = 1;i<=n;i++) for(int j = 1;j<=n;j++){ if(i==j) a[i][j] = 0; else a[i][j] = Inf; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ b[i][j] = 0; } } for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&w); a[x][y] = w; b[x][y] = w; } for(int k = 1;k<=n;k++){ for(int i = 1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][k]+a[k][j]<a[i][j]){ a[i][j] = a[i][k]+a[k][j]; } } } } cout<<a[1][n]<<endl; for(int k = 1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(b[i][k]!=0&&b[k][j]!=0&&b[i][k]+b[k][j]>b[i][j]) b[i][j] = b[i][k]+b[k][j]; } } } cout<<b[1][n]<<endl; return 0; }