zoj 3088 spfa 最短&最长路径

来源:互联网 发布:家庭健身器材 知乎 编辑:程序博客网 时间:2024/05/17 06:30

一看就知道要建立两个图- - 

主要对图的初始化

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;}


0 0
原创粉丝点击