DOJP1520星门跳跃题解

DOJP1520星门跳跃题解

题目

链接

https://deeplearning.org.cn/problem/P1520

字面描述

描述

在 EVE 游戏中,宇宙被划分成为许多区域,每个区域中都有数目不定的星门,可以通过星门来跳跃到特定的区域(星门是双向的)。

现在你正参与 BBE 联军与 MLGBD 联盟的会战,但由于飞船受损,需要尽快回到后方的友军空间站进行维护。

试编写程序,计算出所须的最短的返回空间站时间。

为了简化问题,我们约定飞船所在的位置为区域 1,空间站所在的位置为区域 N。

输入描述

第1行,两个整数N,M,分别为区域的总数和星门的总数;

第2…M+1行,每行三个整数X[i],Y[i],Z[i],分别为星门连接的两个区域,以及跳跃所需时间;

输出描述

一个整数,返回空间站所需的最短时间。

用例输入 1

5 3
1 4 5
4 5 1
1 2 7
用例输出 1

6
用例输入 2

10 11
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9
8 9 10
9 10 11
1 5 7
6 9 3
用例输出 2

28
提示

对于80%的数据,1<N<=10000,1<M<50000;

对于100%的数据,1<N≤30000,1<M<150000,1≤X[],Y[]≤N,1≤Z[]≤4096;

代码实现

#include<bits/stdc++.h>
using namespace std;

const int maxn=6e4+10;
const int maxm=3e5+10;
int n,m,cnt;
int head[maxn],dis[maxn];
bool vis[maxn];
struct node{
	int v,w,nxt;
}e[maxm];
inline void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
inline void Dijkstra(int u){
	queue<int>q;
	memset(dis,0x3f,sizeof(dis));
	dis[u]=0;
	vis[u]=true;
	q.push(u);
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=false;
		for(int i=head[x];i;i=e[i].nxt){
			if(dis[e[i].v]>dis[x]+e[i].w){
				dis[e[i].v]=dis[x]+e[i].w;
				if(!vis[e[i].v]){
					vis[e[i].v]=true;
					q.push(e[i].v);
				}
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	Dijkstra(1);
	printf("%d\n",dis[n]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

materialistOier

我只是一名ssfoier

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值