POJ 3268 Silver Cow Party 最短路

来源:互联网 发布:库伦旗党建网通知公告 编辑:程序博客网 时间:2024/05/08 15:01

题目链接:http://poj.org/problem?id=3268

题意:有n个农场,给出m个单向边,先在给出一个x点,求出各个农场到第x农场来回路径的最大值。

运用Dijkstra分别求出来回最短路即可。

代码如下:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxm=1100;const int inf=100000000;int cost[maxm][maxm],d[maxm],db[maxm],vis[maxm],n,m,x;int jisuan();int main(){int i,j,k,sum,a,b,c;scanf("%d%d%d",&n,&m,&x);for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j)cost[i][j]=0;elsecost[i][j]=inf;}}for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);cost[a][b]=c;}printf("%d\n",jisuan());return 0;}int jisuan(){int i,j,v,mm;for(i=1;i<=n;i++){vis[i]=0;d[i]=cost[x][i];db[i]=cost[i][x];}for(i=1;i<=n;i++){mm=inf;for(j=1;j<=n;j++){if(!vis[j] && d[j]<mm){v=j;mm=d[j];}}vis[v]=1;for(j=1;j<=n;j++){if(!vis[j] && cost[v][j]+d[v]<d[j])d[j]=cost[v][j]+d[v];}}for(i=1;i<=n;i++)vis[i]=0;for(i=1;i<=n;i++){mm=inf;for(j=1;j<=n;j++){if(!vis[j] && db[j]<mm){v=j;mm=db[j];}}vis[v]=1;for(j=1;j<=n;j++){if(!vis[j] && cost[j][v]+db[v]<db[j])db[j]=cost[j][v]+db[v];}}mm=-1;for(i=1;i<=n;i++){mm=max(mm,d[i]+db[i]);}return mm;}


0 0