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
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    扯蛋的密码规则
    【转】mysql安全基线设置
    阿里云安全基线 记录如下 不定时更新
    解决Apache的错误日志巨大的问题以及关闭Apache web日志记录
    cms如何绑定二级域名
    宝塔面板定时/同步备份网站及数据库至FTP存储空间完整教程
    宝塔部署项目报Warning: require(): open_basedir restriction in effect的解决方案
    git学习笔记(一)—— git环境搭建
    vim学习笔记(一)—— vim安装方法
    Intel Edison学习笔记(二)—— 入门环境配置
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7468244.html
Copyright © 2011-2022 走看看