Problem
Angel最近无聊,去了圣诞岛(CX *^_^*),他喜欢无目的的乱逛,当然,他不会轻易地回头。Angel想去广场,那么,他什么时候才能到呢?你已经得到了CX的地图,地图上有N(N <= 100)个交叉路口,交叉路口之间有马路相连接(不超过1000条马路)。因为CX的人遵循奇怪的规则,道路都是单向的,不同的道路之间有一定的距离,我们假设Angel所在的地点为点1,广场所在点为N。假设Angel走一单位距离需要一单位时间。问Angel最早和最迟什么时候到达广场?
Input
本题有多组数据,第一行N, M,M是边的数量以后M行,每行3个整数X, Y, Weight,代表一条从X城市到Y城市,长度为Wweight的边。
Output
每组数据,第一行是最少时间,第二行是最迟时间,要是可怜的Angel可能永远到不了广场,输出一行Never。
Sample Input
5 5
1 2 1
1 4 10
2 3 1
3 4 1
4 5 1
Sample Output
4
11
#include <iostream>
#define MAX_N 502
#define INF 1e7
using namespace std;
int n,m;//点,边
int e[MAX_N][MAX_N];
//int u[MAX_N],v[MAX_N],w[MAX_N];
int u,v;
int book[MAX_N];
int dis[MAX_N];
int longest = 0;
int main(){
cin>>n>>m;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= m; j++){
if(i == j) e[i][j] = 0;
else e[i][j] = INF;
}
for(int i = 1; i <= m; i++){
int x,y,z;
cin>>x>>y>>z;
e[x][y] = z;
}
for(int i = 1; i <= n; i++){
dis[i] = e[1][i];
}
for(int i = 1; i <= n; i++){
book[i] = 0;
} book[1] = 1;
for(int i = 1; i <= n - 1; i++){
int min = INF;
for(int j = 1; j <= n; j++){
if(book[j] == 0 && dis[j] < min){
min = dis[j];
u = j;
}
}
book[u] = 1;
for(v = 1; v <= n; v++){
if(e[u][v] < INF){
if(dis[v] > dis[u] + e[u][v]){
dis[v] = dis[u] + e[u][v];
}
}
}
}
// for(int i = 1; i <= n; i++){
// cout<<dis[i]<<" ";
// }
// cout<<endl;
if(dis[n] < INF) cout<<dis[n]<<endl;
/
int max,maxvex;
for(int i = 0; i <= n; i++){
dis[i] = e[1][i];
book[i] = 0;
}
for(int i = 1; i <= n; i++){
max = 0;
for(int j = 1; j <= n; j++){
if(!book[j] && dis[j] > max && dis[j] < INF){
max = dis[j];
maxvex = j;
}
}
book[maxvex] = 1;
for(int j = 1; j <= n; j++){
if(!book[j] && dis[j] < max + e[maxvex][j] && max + e[maxvex][j] < INF){
dis[j] = max + e[maxvex][j];
}else if(!book[j] && dis[j] == INF && max + e[maxvex][j] < INF)
dis[j] = max + e[maxvex][j];
}
}
cout<<dis[n]<<endl;
return 0;
}