[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

时间: 2024-10-19 19:38:24

[BZOJ] 1631: [Usaco2007 Feb]Cow Party的相关文章

BZOJ 1631: [Usaco2007 Feb]Cow Party( 最短路 )

这道题和蔡大神出的今年STOI初中组的第二题几乎一模一样... 先跑一遍最短路 , 再把所有边反向 , 再跑一遍 , 所有点两次相加的最大值即为answer ----------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #in

【BZOJ】1631: [Usaco2007 Feb]Cow Party(dijskstra)

http://www.lydsy.com/JudgeOnline/problem.php?id=1631 看到m<=100000果断用spfa(可是好像dij比spfa还慢了在这里?) #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include &

bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序

Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同.在排序过程中,JOHN 可以交换任意两头牛的位置.因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛. 请帮JOHN计算把所有牛排好序的最短时间. Input 第1行: 一个数, N. 第2~N+1行: 每行一个数,第i+1行是第

bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】

至今都不知道置换群是个什么东西--题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=10005; int n,w[N],a[N],v[N]; struct qwe { int x,id; }b[N]; bool cmp(const qwe &a

[BZOJ1697][Usaco2007 Feb]Cow Sorting牛排序

1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 712  Solved: 416 [Submit][Status][Discuss] Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同.

BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典

题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 401  Solved: 216[Submit][Status] Description 没有几个人知道,奶牛有她们自己的字典,里面的有W (1 ≤ W ≤ 600)个词,每个词的长度不超过25,且由小写字母组成.她们在交流时,由于各种原因,用词总是不那么准确.比如,贝茜听到有人对她说"browndcodw"

BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ---------------------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; ++i) #define clr(x

Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学

1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 394  Solved: 181[Submit][Status][Discuss] Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置是一个整数点(X_i, Y_i) (-10,0

BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )

直接floyd.. ---------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i ) #define clr( x