【校OJ】圣诞岛的旅行

本文探讨了在一个具有单向道路的图中寻找从起点到终点的最短时间和最迟时间的问题。通过给出的示例输入和输出,文章详细解释了如何使用Dijkstra算法的变体来解决这一挑战,包括初始化距离矩阵、更新最短路径和查找最长路径的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值