zoukankan      html  css  js  c++  java
  • USACO2007-FEB-SILVER(最短路)

    描述
    农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢?
    输入
    第1行:三个用空格隔开的整数. 第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.
    输出
    唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.
    样例输入
    4 8 2
    1 2 4
    1 3 2
    1 4 7
    2 1 1
    2 3 5
    3 1 2
    3 4 4
    4 2 3
    样例输出
    10
    提示
    样例说明:
    共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.
    第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.

    先计算出聚会离所以点的距离

    然后对于每个点再跑一次SPFA,计算其到聚会点的距离,加起来更新答案就是了

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
        char ch=getchar();
        int res=0;
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
        return res;
    }
    int n,m,k,cnt,l,ans,r,adj[1005],nxt[20005],to[20005],val[20005],dis[1005],d[1005];
    bool vis[1005];
    inline void addedge(int u,int v,int w){
        nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v,val[cnt]=w;
    }
    inline void spfa(int s){
        int q[200005],qn;
        memset(dis,127/3,sizeof(dis));
        memset(vis,false,sizeof(vis));
        q[qn=1]=s,vis[s]=true,dis[s]=0;
        for(int ql=1;ql<=qn;ql++){
            int u=q[ql];
            for(int e=adj[u];e;e=nxt[e]){
                int v=to[e];
                if(dis[u]+val[e]<dis[v])
                {
                    dis[v]=dis[u]+val[e];
                    if(!vis[v]){
                        vis[v]=true;
                        q[++qn]=v;
                    }
                }
    
            }
            vis[u]=false;
        }
        return;
    }
    int main(){
        n=read(),m=read(),k=read();
        for(int i=1;i<=m;i++){
            int u=read(),v=read(),w=read();
            addedge(u,v,w);
        }
        int ans=0;
        spfa(k);
        for(int i=1;i<=n;i++){
            d[i]=dis[i];
        }
        for(int i=1;i<=n;i++){
            if(i==k)continue;
            spfa(i);
            ans=max(dis[k]+d[i],ans);
        }
        cout<<ans<<'
    ';
    }
    
  • 相关阅读:
    python模块--time模块
    python模块--如何相互调用自己写的模块
    Animating Views Using Scenes and Transitions
    fragment 切换
    android textview 设置text 字体
    android intent 5.1
    android EditView ime
    animation of android (4)
    animation of android (3)
    animation of android (2)
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366456.html
Copyright © 2011-2022 走看看