zoukankan      html  css  js  c++  java
  • 洛谷 P3371 【模板】单源最短路径(弱化版)

    洛谷 P3371 【模板】单源最短路径(弱化版)

    洛谷传送门

    题目背景

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

    题目描述

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

    输入格式

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

    接下来 mm 行每行包含三个整数 u,v,wu,v,w,表示一条 u o vuv 的,长度为 ww 的边。

    输出格式

    输出一行 nn 个整数,第 ii 个表示 ss 到第 ii 个点的最短路径,若不能到达则输出 2^{31}-1231−1。


    题解:

    注意,有向边。

    代码:

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int maxn=1e4+4;
    const int maxm=5e5+5;
    const int maxx=1e9;
    const int INF=2147483647;
    int n,m,s;
    int tot,head[maxn],nxt[maxm<<1],to[maxm<<1],val[maxm<<1];
    void add(int x,int y,int z)
    {
    	to[++tot]=y;
    	nxt[tot]=head[x];
    	head[x]=tot;
    	val[tot]=z;
    }
    queue<int> q;
    int dist[maxn];
    bool v[maxn];
    void spfa()
    {
    	memset(dist,127,sizeof(dist));
    	dist[s]=0;
    	q.push(s);
    	v[s]=1;
    	while(!q.empty())
    	{
    		int x=q.front();
    		q.pop();
    		v[x]=0;
    		for(int i=head[x];i;i=nxt[i])
    		{
    			int y=to[i];
    			if(dist[y]>dist[x]+val[i])
    			{
    				dist[y]=dist[x]+val[i];
    				if(!v[y])
    				{	
    					v[y]=1;
    					q.push(y);
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&s);
    	for(int i=1;i<=m;i++)
    	{
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z);
    	}
    	spfa();
    	for(int i=1;i<=n;i++)
    	{
    		if(dist[i]>maxx)
    			printf("%d ",INF);
    		else
    			printf("%d ",dist[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    初始mybatis
    Tomcat项目部署过程中的问题
    java基础之二维数组不定义列数
    java基础之二维数组-杨辉三角
    java基础之二维数组-杨辉三角
    java浮点运算的陷阱
    java浮点运算的陷阱
    java主函数参数传递args
    java主函数参数传递args
    java基本数据类型
  • 原文地址:https://www.cnblogs.com/fusiwei/p/14080801.html
Copyright © 2011-2022 走看看