zoukankan      html  css  js  c++  java
  • poj3268(最短路)

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

    题意:给出n个点和m条单向边,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出。

    分析:先跑一遍dij求出x到其他点的最短距离,再反向建图,求出各点到达x的最短距离,然后枚举一下即可。

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 100000000
    #define inf 0x3f3f3f3f
    #define eps 1e-9
    #define N 1010
    #define FILL(a,b) (memset(a,b,sizeof(a)))
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define PII pair<int,int>
    using namespace std;
    struct node
    {
        int u,v,w;
        node(){}
        node(int v,int w):v(v),w(w){}
        bool operator<(const node &a)const
        {
            return w>a.w;
        }
    }e[N*100];
    int dp1[N],dp2[N],vis[N],n,m,x;
    vector<node>g[N];
    void dij(int dp[])
    {
        priority_queue<node>que;
        while(!que.empty())que.pop();
        for(int i=1;i<=n;i++)dp[i]=inf;
        FILL(vis,0);
        node cur,nxt;
        cur.v=x;cur.w=0;
        dp[x]=0;
        que.push(cur);
        while(!que.empty())
        {
            cur=que.top();que.pop();
            int u=cur.v;
            if(vis[u])continue;
            vis[u]=1;
            for(int i=0,sz=g[u].size();i<sz;i++)
            {
                nxt=g[u][i];
                int v=nxt.v,w=nxt.w;
                if(dp[u]+w<dp[v])
                {
                    dp[v]=dp[u]+w;
                    que.push(node(v,dp[v]));
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&x)>0)
        {
            for(int i=1;i<=n;i++)g[i].clear();
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
                g[e[i].u].push_back(node(e[i].v,e[i].w));
            }
            dij(dp1);
            for(int i=1;i<=n;i++)g[i].clear();
            for(int i=1;i<=m;i++)
            {
                g[e[i].v].push_back(node(e[i].u,e[i].w));
            }
            dij(dp2);
            int ans=0;
            for(int i=1;i<=n;i++)ans=max(ans,dp1[i]+dp2[i]);
            printf("%d
    ",ans);
        }
    }
    View Code
  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/lienus/p/4273251.html
Copyright © 2011-2022 走看看