单源最短路 bellman_ford算法(模板)
2016-08-22 21:19
381 查看
/* 单源最短路bellman_ford算法,复杂度O(VE) 可以处理负边权图。 可以判断是否存在负环回路。返回true,当且仅当图中不包含从源点可达的负权回路 vector<Edge> E;先E.clear()初始化,然后加入所有边 点的编号从1开始(从0开始简单修改就可以了) */ #include<iostream> #include<cstdio> #include<vector> #include<fstream> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=550; int dist[MAXN]; struct Edge { int u,v; int cost; Edge(int _u=0,int _v=0,int _cost=0):u(_u),v(_v),cost(_cost){} }; vector<Edge> E; bool bellman_ford(int start,int n)//点的编号从1开始 { for(int i=1;i<=n;i++) dist[i]=INF; dist[start]=0; for(int i=1;i<n;i++) { bool flag=false; for(int j=0;j<E.size();j++) { int u=E[j].u; int v=E[j].v; int cost=E[j].cost; if(dist[v]>dist[u]+cost) { dist[v]=dist[u]+cost; flag=true; } } if(!flag) return true;//没有负环回路 } for(int j=0;j<E.size();j++) if(dist[E[j].v]>dist[E[j].u]+E[j].cost) return false;//有负环回路 return true;//没有负环回路 } int main() { //freopen("in.txt","r",stdin); int n; int e; cin>>n>>e; if(!E.empty()) E.clear(); //for(int i=1;i<=MAXN;i++) dist[i]=INF; int u,v,c; for(int i=0;i<e;i++) { int u,v,c; cin>>u>>v>>c; E.push_back(Edge(u,v,c)); } bool mark=bellman_ford(1,n); if(mark) { cout<<"no negative circle"<<endl; for(int i=1;i<=n;i++) cout<<dist[i]<<" "; cout<<endl; } else cout<<"have negative circle"<<endl; return 0; }
相关文章推荐
- 单源最短路之bellman-ford算法(解决有负权存在的情况)
- [单源最短路]Bellman-Ford算法
- 单源最短路之spfa算法代码(bellman-ford算法的队列优化)
- 单源最短路 Bellman-Ford算法
- ACM模板 Bellman_Ford,单源最短路,图论
- 最小费用流模板(Bellman-Ford算法找最短路)
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- 单源最短路模板——SPFA
- 单源最短路径算法之Bellman-Ford算法
- 最短路--Bellman-Ford算法
- 单源最短路径-Bellman-Ford算法
- 最短路 - bellman-ford 算法模板
- 2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法
- 最短路问题 Bellman-Ford算法
- 带负权图的单源最短路径算法:Bellman-Ford算法
- Aizu 2249Road Construction 单源最短路变形 spfa模板改写
- [ACM模板]单源最短路SPFA
- POJ-3259 Wormholes(最短路 Bellman-Ford算法)
- poj 3259 Wormholes(最短路Bellman-Ford算法)
- 图之单源最短路径 Bellman-Ford算法 Dijkstra算法 SPFA算法