最短时间(Dijistra)

本文介绍了一种在梦工厂分厂网络中寻找最优路径的方法,旨在让两人分别通过铁路和公路从1号分厂到n号分厂,且避免中途同时停留同一分厂。采用迪杰斯特拉算法求解最短路径,适用于不超过500个节点的网络。

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

时间限制:500ms
内存限制:100M
最短时间
描述:

梦工厂有 n 个分厂(从 1 开始编号),有m对分厂通过双向铁路相连。
为了保证每两个分厂之间的同学可以方便地进行交流,掌舵人张老师就在那些没有铁路连接的分厂之间建造了公路。
在两个直接通过公路或铁路相连的分厂之间移动,需要花费 1 小时。
现在菜鸡wxy和hbz都从1厂出发,wxy开火车,hbz开汽车,各自前往n厂。但是,他们中途不能同时停在同一个分厂
(但是可以同时停在n厂)。
现在请你来为wxy和hbz分别设计一条线路,使他们尽可能快地到达n厂(即要求他们中最后到达n厂的时间最短)。
所有的公路或铁路可以被多次使用,求最短时间。(火车和汽车可以同时到达n,也可以先后到达。)

输入:
首先有 2 个整数 n 和 m (2<=n<=500, 0<=m<=n*(n-1)/2 分别表示梦工厂分厂的数目和铁路的数目;

接下来的 m 对数字,每对由两个整数 u 和 v 构成,表示小镇 u 和小镇 v 之间有一条铁路。(u!=v 1<=u,v<=n)
输入保证无重边

输出

输出一个整数,表示答案,如果没有合法的路线规划,输出-1

输入样例:
4 3
1 2
2 3
3 4

输出样例:
3

分析:每两个工厂之间不是由铁路连接就是由公路连接,所以1-n必有一条路,所以1-n花费时间为1,如果,1-n由铁路相连,我们就计算公路从1到n的最短时间;反之,若1-n由公路相连,我们就计算铁路从1到n的最短时间。所以,我们需要两张地图分别存铁路和公路。然后用迪杰斯特拉求一下最短时间就可以了;

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; 
#define Inf 0x3f3f3f
int n,m;
int G1[505][505];//存铁路的图
int G2[505][505];//存公路的图
int dis[505],vis[505]; 
void Dijistra(int G[][505]){
	for(int i=1;i<=n;i++){
		dis[i]=Inf;
		vis[i]=0;
	}
	dis[1]=0;
	for(int i=1;i<=n;i++)
	{
		int min=Inf;
		int k;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&min>dis[j]){
				min=dis[j];
				k=j;
			}
		}
		vis[k]=1;
		for(int j=1;j<=n;j++)
		{
			if(G[k][j]!=0&&!vis[j]&&dis[k]+G[k][j]<dis[j])
			dis[j]=dis[k]+G[k][j];
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d %d",&a,&b);
		G1[a][b]=G1[b][a]=1;
	}
	if(G1[1][n]==0){
		Dijistra(G1);
		int re=dis[n];
		if(re==Inf)
		printf("-1\n");
		else printf("%d\n",re);
	}
	else{
		for(int i=1;i<=n;i++){//给公路赋值 
			for(int j=i+1;j<=n;j++){
				if(G1[i][j]==0) //铁路连接不到的就是公路可以连接到的 
				G2[i][j]=G2[j][i]=1;
			}
}
		Dijistra(G2);
		int re=dis[n];
		if(re==Inf)
		printf("-1\n");
		else printf("%d\n",re);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值