【luogu3371】【图论】【最短路】【模板】单源最短路径(弱化版)

别来无恙 提交于 2020-01-16 08:11:02

题目背景

本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。
题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入格式

第一行包含三个整数 n,m,sn,m,sn,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 mmm 行每行包含三个整数 u,v,wu,v,wu,v,w,表示一条 u→vu \to vu→v 的,长度为 www 的边。
输出格式

输出一行 nnn 个整数,第 iii 个表示 sss 到第 iii 个点的最短路径,若不能到达则输出 231−12^{31}-1231−1。
输入输出样例
输入 #1

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出 #1

0 2 4 3

说明/提示

【数据范围】
对于 20%20%20% 的数据:1≤n≤51\le n \le 51≤n≤5,1≤m≤151\le m \le 151≤m≤15;
对于 40%40%40% 的数据:1≤n≤1001\le n \le 1001≤n≤100,1≤m≤1041\le m \le 10^41≤m≤104;
对于 70%70%70% 的数据:1≤m≤10001\le m \le 10001≤m≤1000,1≤m≤1051\le m \le 10^51≤m≤105;
对于 100%100%100% 的数据:1≤n≤1041 \le n \le 10^41≤n≤104,1≤m≤5×1051\le m \le 5\times 10^51≤m≤5×105,保证数据随机。

对于真正 100%100%100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

样例说明:
在这里插入图片描述

图片1到3和1到4的文字位置调换


解题思路

模板SPFA


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=0x7fffffff;
struct DT{
	int to,l,next;
}a[600000];
int dis[20000],head[20000],n,m,k,num;
queue<int> v;
int h,t,f[20000];
void SPFA(int s){
	memset(dis,0x7f,sizeof(dis));
	v.push(s);
	h=0,t=1,dis[s]=0,f[s]=1;
	while(!v.empty()){
		for(int i=head[v.front()];i;i=a[i].next){
			if(dis[v.front()]+a[i].l<dis[a[i].to]){
				dis[a[i].to]=dis[v.front()]+a[i].l;
				if(!f[a[i].to]){
					v.push(a[i].to);
					f[a[i].to]=1;
				}
			}
		}
		f[v.front()]=0;
		v.pop();
	}
}
int main(){
	scanf("%d%d%d",&m,&n,&k);
	for(int i=1;i<=n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		a[++num].to=y,a[num].l=z,a[num].next=head[x],head[x]=num;//有向图
	}
	SPFA(k);
	for(int i=1;i<=m;i++)
	    if(dis[i]==dis[0])
	       printf("2147483647 ");//别忘了
	     else 
	    	printf("%d ",dis[i]);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!