zoj 3088 spfa 最短&最长路径
2014-08-06 22:09
405 查看
一看就知道要建立两个图- -
主要对图的初始化
spfa 求最长最短路径
主要对图的初始化
spfa 求最长最短路径
#include <queue> #include <vector> #include <cstdio> #include<string.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; int n,m,k; int down[1010][1010],up[1010][1010]; int distdown[1010],distup[1010]; int pathdown[1010],pathup[1010]; int pathans[2020],id; inline void read(int &m) { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} m=x*f; } void f(int temp) { if(pathup[temp]==-1)return; f(pathup[temp]); pathans[id++]=temp; } void copypath(int i,int j) { id=1; pathans[id++]=i; f(j); while(pathdown[j]!=-1) { pathans[id++]=pathdown[j]; j=pathdown[j]; } } void spfa_down(int k) //spfa求最长路径 { bool vis[1010]; memset(vis,0,sizeof(vis)); memset(distdown,0,sizeof(distdown)); //比图的无限小稍微大 queue<int>que; vis[k]=1; pathdown[k]=-1; que.push(k); while(!que.empty()) { int v=que.front(); que.pop(); vis[v]=0; for(int i=1;i<=n;i++) if(distdown[v]+down[v][i]>distdown[i]) { distdown[i]=distdown[v]+down[v][i]; pathdown[i]=v; if(!vis[i]) vis[i]=1,que.push(i); } } } void spfa_up(int k) //spfa求最短路径 { bool vis[1010]; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) distup[i]=100000000; //比图的无限大稍微小。不过正常来说令其与图相等,即无限大 vis[k]=1; distup[k]=0; pathup[k]=-1; queue<int>que; que.push(k); while(!que.empty()) { int v=que.front(); que.pop(); vis[v]=0; for(int i=1;i<=n;i++) if(distup[v]+up[v][i]<distup[i]) { distup[i]=distup[v]+up[v][i]; pathup[i]=v; if(!vis[i]) vis[i]=1,que.push(i); } } } int main() { int cas,a,b,c; read(cas); while(cas--) { read(n),read(m),read(k); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) up[i][j]=100000000,down[i][j]=-10000000;//将图设为正无限大,负无限大 for(int i=1;i<=m;i++) { read(a),read(b),read(c); down[b][a]=c;//反转 } for(int i=1;i<=k;i++) { read(a),read(b),read(c); up[a][b]=c; } double maxn=0; for(int i=1;i<=n;i++) { spfa_down(i); spfa_up(i); for(int j=1;j<=n;j++) if(i==j)continue; else if(distdown[j]!=0&&distup[j]!=10000000) { double d=1.0*distdown[j]/distup[j]; if(d>maxn) { maxn=d; copypath(i,j); } } } for(int i=1;i<id;i++) printf("%d ",pathans[i]); printf("\n%.3f\n",maxn); } return 0; }
相关文章推荐
- POJ 3835 Columbus's bargain (最短路径 spfa 算法)
- BellmanFord && SPFA && Dijkstra 求最短路径
- 【模板】最短路径(Floyed&SPFA )
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- hdoj-1869 六度分离【最短路径--dijkstra&&spfa&&floyd】
- POJ 1201 & HDU1384 & ZOJ 1508 Intervals(差分约束+spfa 求最长路径)
- 最短路径 -- Floyd-Warshall & Dijkstra & spfa 学习和思考
- hihoCoder - 1093 - 最短路径·三:SPFA算法 (SPFA)
- hdoj-2544 最短路【最短路径--dijkstra&&spfa&&floyd】
- zoj1655 spfa 最长路径
- POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)
- 最短路径算法Dijkstra && SPFA && Floyd 代码实现模板
- HDU 1317--XYZZY 【spfa判断正环求最长路径 && floyd求传递闭包】
- hdoj 1317 XYZZY 【spfa判断正环求最长路径&&floyd求传递闭包】
- HDU 2112 HDU Today 【最短路径 dijkstra & floyed & SPFA 】
- 四种最短路径算法(Dijkstra,Floyd,Bellman-ford&&spfa)
- *最短路径 Bellman-Ford & SPFA 算法实战
- 几大最短路径算法比较(Floyd & Dijkstra & Bellman-Ford & SPFA)
- hdu3790 最短路径问题 (Dijkstra & SPFA)