算法训练 最短路 Bellman-Ford
2017-02-21 16:07
393 查看
问题描述
给定一个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,保证从任意顶点都能到达其他所有顶点。
思路:
因为题目中说有负权边,所以我们就不能使用dijkstra算法了,只能选用Bellman-Ford 这里用了队列优化
给定一个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,保证从任意顶点都能到达其他所有顶点。
思路:
因为题目中说有负权边,所以我们就不能使用dijkstra算法了,只能选用Bellman-Ford 这里用了队列优化
#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; const int N=20010; const int M=200010; int book ,dis ; int n,m; struct node { int to; int cost; }; int main() { int t; struct node temp; memset(book,0,sizeof(book)); scanf("%d%d",&n,&m); vector<node>eg ; queue<int>Q; for(int i=1;i<=m;i++) { scanf("%d %d %d",&t,&temp.to,&temp.cost); eg[t].push_back(temp); } for(int i=1;i<=n;i++) dis[i]=inf; dis[1]=0; Q.push(1); book[1]=1; while(!Q.empty()) { int w=Q.front(); Q.pop(); for(int i=0;i<eg[w].size();i++) { if(dis[eg[w][i].to]>dis[w]+eg[w][i].cost) { dis[eg[w][i].to]=dis[w]+eg[w][i].cost; if(book[eg[w][i].to]==0) { book[eg[w][i].to]=1; Q.push(eg[w][i].to); } } } book[w]=0; } for(int i=2;i<=n;i++) { printf("%d\n",dis[i]); } return 0; }
相关文章推荐
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法汇总 HDU 2544为例
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 广度优先搜索以及队列优化的 Bellman-Ford 短路算法
- 最短路 - bellman-ford 算法模板
- ⑨讲图论第五课: Bellman-Ford算法求最短路
- hdu2544 最短路 Dijstra算法堆优化,Bellman-Ford,Bellman-Ford队列优化
- 蓝桥杯_算法训练_节点选择(用Dijkstra,Bellman-Ford,SPFA算法分别实现)
- ⑨讲图论第五课: Bellman-Ford算法求最短路
- poj 2240(bellman_ford 算法)(最短路负权)Arbitrage
- 浅谈最短路中的Bellman–Ford 算法 (SPFA
- poj Wormholes (最短路 spfa Bellman-Ford 算法 邻接表实现)
- 蓝桥杯 算法训练 最短路 [ 最短路 bellman ]
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 算法-从动态规划到贪心算法,Bellman-Ford和Dijkstra算法求解最短路
- 蓝桥杯 算法训练 最短路 (Bellman-Ford算法)
- poj3259 bellman_ford 算法 判环 最短路
- poj - 3259 Wormholes (bellman-ford算法求最短路)