单源最短路SPFA(模板)
2016-08-23 21:12
309 查看
/* 单源最短路SPFA 时间复杂度O(kE) 这个是队列实现,有时候改成栈实现会更加快,很容易修改 这个复杂度是不定的 */ #include<iostream> #include<cstdio> #include<vector> #include<queue> #include<fstream> #include<string.h> using namespace std; const int MAXN=1010; const int INF=0x3f3f3f3f; struct Edge { int v; int cost; Edge(int _v=0,int _cost=0): v(_v),cost(_cost){} }; vector<Edge> E[MAXN]; void addedge(int u,int v,int w) { E[u].push_back(Edge(v,w)); } bool vis[MAXN]; int cnt[MAXN]; int dist[MAXN]; bool SPFA(int start,int n) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) dist[i]=INF; vis[start]=true; dist[start]=0; queue<int> que; while(!que.empty()) que.pop(); que.push(start); memset(cnt,0,sizeof(cnt)); cnt[start]=1; while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=false; for(int i=0;i<E[u].size();i++) { int v=E[u][i].v; if(dist[v]>dist[u]+E[u][i].cost) { dist[v]=dist[u]+E[u][i].cost; if(!vis[v]) { vis[v]=true; que.push(v); if(++cnt[v]>n) return false; //cnt[i]为入队列次数,用来判断是否存在负环回路 } } } } return true; } int main() { freopen("in.txt","r",stdin); int n; int e; cin>>n>>e; int u,v,w; for(int i=1;i<=e;i++) { cin>>u>>v>>w; addedge(u,v,w); } bool flag=SPFA(1,n); if(!flag) cout<<"have negative circle"<<endl; else cout<<"no negative circle"<<endl; for(int i=1;i<=n;i++) cout<<dist[i]<<" "; cout<<endl; return 0; }
相关文章推荐
- 单源最短路----Spfa模板 (SLF优化)
- hdu 3790 最短路spfa模板
- 单源最短路spfa模板(stl更新版)
- [ACM模板]单源最短路SPFA
- 基础最短路(模板 spfa)
- 最短路模板 Dijkstra+Floyd+SPFA
- 最短路-SPFA 模板
- HDU 2544 最短路 SPFA 邻接表 模板
- hdu2680 Choose the best route(spfa求最短路模板题)
- spfa 有无负权环 负权边最短路 模板
- (模板题)sdut 2143 图结构练习——最短路径(SPFA求最短路)
- Wormholes---poj3259(最短路 spfa 判断负环 模板)
- HDU 2544 最短路 floyd djkstra(邻接表,邻接矩阵) spfa bellman-ford 模板题
- spfa求最短路模板(邻接矩阵)
- 最短路 【spfa】 模板
- hdu 1548 A strange lift 最短路 spfa模板
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- spfa求最短路模板(邻接表)
- Aizu 2249 单源最短路变形 spfa模板改写
- 最短路 hdu2544 (spfa)(模板)