算法训练 最短路

  算法训练 最短路  
时间限制:1.0s   内存限制:256.0MB
       
问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

做的第一个最短路径问题!用的bellman算法,可以处理负边的情况。

#include <iostream>
#include <cstdio>
#include <cstring>
#define max_v 50005
#define max_e 500005
#define INF 0x3f3f3f3f

using namespace std;

struct edge{int from,to,cost;};
edge ee[max_e];//存储每条边的信息
int d[max_v];//表示s到每个顶点的最短距离
int v,e;//顶点数和边数

//返回true计算最短路成功,返回false存在负圈;
bool bellman(int s){
    memset(d,INF,sizeof(d));//赋最大值的技巧
    d[s]=0;
    int j=0;//添加的计数器
    while(true){
        bool update=false;
        for(int i=0;i<e;i++){
            edge et=ee[i];
            if(d[et.from]!=INF&&d[et.to]>d[et.from]+et.cost){
                d[et.to]=d[et.from]+et.cost;
                update=true;
            }
        }
        j++;
        if(!update) return true;
        if(j==v) return false;//当进行第v次循环时,说明存在负圈
    }
}


int main()
{
    int x,y,z;
    scanf("%d %d",&v,&e);
    for(int i=0;i<e;i++){
        scanf("%d %d %d",&x,&y,&z);
        x-=1;
        y-=1;
        ee[i].from=x;
        ee[i].to=y;
        ee[i].cost=z;
        ee[e+i].from=y;
        ee[e+i].to=x;
        ee[e+i].cost=z;
    }
    bellman(0);
    for(int i=1;i<v;i++){
        printf("%d\n",d[i]);
    }
    return 0;
}

 

全部评论

相关推荐

等闲_:感觉有好多地方会被问穿,mysql存储向量这个方案问题应该很大的,如果深问的的话,为什么不用es,不用pg,不用mivus,分块策略是怎么做的,向量化是怎么向量化的,稠密向量还是稀疏向量,再深问余弦相似度,HSWM算法,Bm25算法,为什么不用混合检索或者Rank重排序优化?其他的项目不停机分库分表咋实现的,切库过程中数据有diff的话有没有补偿策略?既然有了分库分表了有没有碰到业务上不好优化的慢sql,让这个sql读从库?而且点评的话,最好自己压测过,要不这个数据也不好解释。现在就27的情况来看,很多同学已经有了中大厂实习,这个节点也会偏向这些有大厂实习的92同学,而且hc也不多,所以坚持海投吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
双尔:你就写拥有ai开发经历,熟练运用提示词,优化ai,提高ai回答质量
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务