zoukankan      html  css  js  c++  java
  • [BZOJ] 1631: [Usaco2007 Feb]Cow Party

    1631: [Usaco2007 Feb]Cow Party

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 866  Solved: 624
    [Submit][Status][Discuss]

    Description

        农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢?

    Input

    第1行:三个用空格隔开的整数.

     第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.

    Output

    唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.

    Sample Input

    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

    Sample Output

    10

    HINT

    样例说明:


    共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.


    第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.

    Source

    Silver

    Analysis

    正反图+最短路

    嗯,好像在Codevs上见过?=w=

     

    Code

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 #define maxn 1000000
     6 using namespace std;
     7 
     8 struct edge{
     9     int from,v,len;
    10 }e[maxn],e1[maxn]; 
    11 
    12 const int inf = 0x3f3f3f3f;
    13 bool book[maxn];
    14 int tot,tot1,first[maxn],first1[maxn],n,m,a,b,c,x,dis[maxn],dis1[maxn];
    15 void insert(int u,int v,int len){
    16     tot++;
    17     e[tot].from = first[u];
    18     e[tot].v = v;
    19     e[tot].len = len;
    20     first[u] = tot;
    21     
    22     tot1++;
    23     e1[tot1].from = first1[v];
    24     e1[tot1].v = u;
    25     e1[tot1].len = len;
    26     first1[v] = tot;
    27 }
    28 
    29 void SPFA(){
    30     memset(book,false,sizeof(book));
    31     for(int i = 1;i <= n;i++) dis[i] = inf;
    32     
    33     queue<int> Q;
    34     Q.push(x);
    35     book[x] = true;
    36     dis[x] = 0;
    37     
    38     while(!Q.empty()){
    39         int p = Q.front();
    40         Q.pop();
    41         
    42         for(int i = first[p];i;i = e[i].from){
    43             int v = e[i].v;
    44             if(dis[v] > dis[p]+e[i].len){
    45                 dis[v] = dis[p]+e[i].len;
    46                 if(!book[v]){
    47                     book[v] = true;
    48                     Q.push(v);
    49                 }
    50             }
    51         }
    52         book[p] = false;
    53     }
    54     
    55     for(int i = 1;i <= n;i++) dis1[i] = inf;
    56     Q.push(x);
    57     dis1[x] = 0;
    58     book[x] = true;
    59     
    60     while(!Q.empty()){
    61         int p = Q.front();
    62         Q.pop();
    63         
    64         for(int i = first1[p];i;i = e1[i].from){
    65             int v = e1[i].v;
    66             if(dis1[v] > dis1[p]+e1[i].len){
    67                 dis1[v] = dis1[p]+e1[i].len;
    68                 if(!book[v]){
    69                     book[v] = true;
    70                     Q.push(v);
    71                 }
    72             }
    73         }
    74         book[p] = false;
    75     }
    76     
    77     int maxx = 0;
    78     for(int i = 1;i <= n;i++){
    79         maxx = max(maxx,dis[i]+dis1[i]);
    80     }
    81     
    82     printf("%d",maxx);
    83 }
    84 
    85 int main(){
    86     scanf("%d%d%d",&n,&m,&x);
    87     
    88     for(int i = 1;i <= m;i++){
    89         scanf("%d%d%d",&a,&b,&c);
    90         insert(a,b,c);
    91     }
    92     
    93     SPFA();
    94     
    95     return 0;
    96 } 
    SPFA ver
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    XX需求分析系统每日进度(二)
    XX需求分析系统每日进度(一)
    周总结(二)
    Hyperleder Fabric chaincode生命周期
    【转】六种学术不端的引用行为
    引导学生,让学生不走神。
    MySQL 的常用引擎
    LeetCode283移动零问题java高效解法
    使用android studio进行springboot项目的开发
    android逆向反编译工具包下载
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7468244.html
Copyright © 2011-2022 走看看