【图论】【SPFA】单源最短路径(弱化版)

17 篇文章 0 订阅
14 篇文章 0 订阅

题目链接

l u o g u P 3371 luogu P3371 luoguP3371(弱化版)
l u o g u P 4779 luoguP4779 luoguP4779(标准版)
本篇博客写的是弱化版的,标准版的 S P F A SPFA SPFA好像过不了…

题目

有一个有向图,请输出从起始点出发到每一个点的最短路

输入输出格式

输入格式:

第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。

输出格式:

一行,包含N个用空格分隔的整数,其中第i个整数表示从点S出发到点i的最短路径长度(若S=i则最短路径长度为0,若从点S无法到达点i,则最短路径长度为2147483647)

样例输入输出

输入
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出
0 2 4 3

思路

其实这道题就是一道 S P F A SPFA SPFA的模板题,我们可以用邻接表来做

代码

#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
bool b[10005];
int n,s,m,tot,x,y;
int h[10005],ed[10005];
struct hop
{
	int w,z,p;
}op[500005];//w表示当前点,z表示从第i个点到这个点的距离,p表示从哪个点来
int main()
{
	memset(ed,127/3,sizeof(ed));
	int t=0;
	scanf("%d%d%d",&n,&m,&s);
	for (int i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&x,&y,&tot);
		op[++t]=(hop){y,tot,h[x]};h[x]=t;
	}
	ed[s]=0;
	queue<int>d;
	d.push(s);
	b[s]=1;
	while (d.size())//判断队列是否为空
	{
		tot=d.front();
		d.pop();
		for (int i=h[tot];i;i=op[i].p)
		if (ed[op[i].w]>ed[tot]+op[i].z)
	     {
	     	ed[op[i].w]=ed[tot]+op[i].z;
	     	if (!b[op[i].w])//判断是否在队列当中
	     	{
	     		d.push(op[i].w);
	     		b[op[i].w]=1;
			}
		 }	 
	    b[tot]=0;
	}
	for (int i=1; i<=n; ++i)
		printf("%d ",ed[i] == 707406378 ? 2147483647 : ed[i]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值