POJ3268 - Silver Cow Party - Dijkstra跑两遍最短路

题意

有\(N\)头牛,序号为1-N(来自不同牛场),他们要去序号为\(X\)的地方参加派对,
问去+返的最少时间。(但是我有疑惑的是:题目的输出给的是“the maximum of time”???)
每组数据给出N、M、X,接下来M条边,是有向图。

思路

先用Dijkstra跑一遍最短路,接着讲该邻接矩阵倒置再跑一遍Dijkstra即可。

关于Dijkstra的优化

https://blog.csdn.net/acm_1361677193/article/details/48211319

AC代码

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<list>
#include<stdlib.h>
#include<map>
#include<stack>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
#define sc(T) scanf("%d",&T)
#define scc(x,y) scanf("%d %d",&x,&y)
#define pr(T) printf("%d\n",T)
#define f(a,b,c) for (int a=b;a<=c;a++)
#define ff(a,b,c) for (int a=b;a>=c;a--)
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
#define PI acos(-1)

const int N=1010;
int n,m,x,e[N][N],dis1[N],dis2[N];
bool book[N];

void dijkstra(int*dis)
{
    f(i,1,n)
        book[i]=0;
    book[x]=1;
    f(i,1,n)
        dis[i]=e[x][i];
    int k;
    f(i,2,n)
    {
        int mi=inf;
        f(j,1,n)
        {
            if(!book[j]&&dis[j]<mi)
                mi=dis[j],k=j;
        }
        book[k]=1;
        f(j,1,n)
            dis[j]=min(dis[j],dis[k]+e[k][j]); // max
    }
}

int main()
{
    scanf("%d %d %d",&n,&m,&x);
    f(i,1,n)
    {
        f(j,1,n)
        {
            if(i==j)
                e[i][j]=0;
            else
                e[i][j]=inf;
        }
    }
    f(i,1,m)
    {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        //e[x][y]=max(e[x][y],z);
        //if(z>e[x][y])
        if(z<e[x][y])
            e[x][y]=z;
    }
    dijkstra(dis1);
    f(i,1,n)
    {
        f(j,i+1,n)
            swap(e[i][j],e[j][i]);
    }
    dijkstra(dis2);
    int ma=-inf;
    f(i,1,n)
        ma=max(ma,dis1[i]+dis2[i]);
    pr(ma);
    return 0;
}
上一篇:最短路Dijkstra_[模板]


下一篇:题解 洛谷 P3640 【[APIO2013]出题人】