BZOJ1631 [Usaco2007 Feb]Cow Party

凑数用的。。。其实是刚写了个spfa的板子,感觉很好而已。。。

每个点spfa一边就过了。。。蒟蒻都觉得水。。。

 1 /**************************************************************
 2     Problem: 1631
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:196 ms
 7     Memory:2380 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13
14 using namespace std;
15 const int N = 1005;
16 struct edge{
17     int next, to, v;
18 }e[100005];
19 int n, m, S, X, Y, Z, tot;
20 int q[100005], dis[N], first[N], dis1[N], ANS;
21 bool v[N];
22
23 inline int read(){
24     int x = 0, sgn = 1;
25     char ch = getchar();
26     while (ch < ‘0‘ || ch > ‘9‘){
27         if (ch == ‘-‘) sgn = -1;
28         ch = getchar();
29     }
30     while (ch >= ‘0‘ && ch <= ‘9‘){
31         x = x * 10 + ch - ‘0‘;
32         ch = getchar();
33     }
34     return sgn * x;
35 }
36
37 inline void add_edge(int x, int y, int z){
38     e[++tot].next = first[x], first[x] = tot;
39     e[tot].to = y, e[tot].v = z;
40 }
41
42 void spfa(int S){
43     memset(dis, 127, sizeof(dis));
44     q[0] = S, dis[S] = 0, v[S] = 1;
45     int p, x, y;
46     for (int l = 0, r = 0; l <= r; ++l){
47         p = q[l];
48         for (x = first[p]; x; x = e[x].next){
49             y = e[x].to;
50             if (dis[p] + e[x].v < dis[y]){
51                 dis[y] = dis[p] + e[x].v;
52                 if (!v[y])
53                     v[y] = 1, q[++r] = y;
54             }
55         }
56         v[p] = 0;
57     }
58 }
59
60 int main(){
61     n = read(), m = read(), S = read();
62     for (int i = 1; i <= m; ++i){
63         X = read(), Y = read(), Z = read();
64         add_edge(X, Y, Z);
65     }
66     for (int i = 1; i <= n; ++i){
67         spfa(i);
68         dis1[i] = dis[S];
69     }
70     spfa(S);
71     for (int i = 1; i <= n; ++i)
72         ANS = max(ANS, dis[i] + dis1[i]);
73     printf("%d\n", ANS);
74     return 0;
75 }

(p.s.  感觉做法已经很快了啊。。。那些20ms的人心态呢。。。都是怎么做的。。。)

时间: 2024-08-24 20:24:08

BZOJ1631 [Usaco2007 Feb]Cow Party的相关文章

[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] 1631: [Usaco2007 Feb]Cow Party

1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 866  Solved: 624[Submit][Status][Discuss] Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最

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

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

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行是第

bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 &amp; bzoj1119:[POI2009]SLO

思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环内最小的数,但也可能存在一个数使得它不在当前处理的环内而它先与当前环内某个数进行交换,然后再在环内进行交换,再将之前那个数换回来,这样也显然要选择所有元素中最小的和当前环内最小的进行交换,然后取个min即可.然后还要注意可能当前环内最小的就是所有元素中最小的,特判一下即可. 1 #include<i

【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牛排序

[算法]数学置换 [题意]给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价. [题解] 考虑置换的定义:置换就是把n个数做一个全排列. 从原数组到排序数组的映射就是经典的置换,这样的置换一定能分解成循环的乘积. 为什么任意置换都可以这样分解:原数组的每个数要交换到排序位置(有后继),每个数的原位置会有数字来替代(有前驱),故一定构成若干循环节. 循环节内要完成置换,需要按顺序依次替换位置进行len-1次对换(len为循环节长度). 对于每一循环节内部

P1697: [Usaco2007 Feb]Cow Sorting牛排序

这是一道置换群的裸题=-=,先拿来试试手对着打,以后应该会更加熟练吧! 1 const maxn=100001; 2 var n,i,j,maxx,minx,now,len,cursum,tmin,sum:longint; 3 p:array[0..maxn] of boolean; 4 agr,pos:array[0..maxn] of longint; 5 function min(a,b:longint):longint; 6 begin 7 if a>b then exit(b) 8 e

P1631: [Usaco2007 Feb]Cow Party

还是水题,接近于裸的spfa(个人比较喜欢用spfa,dijkstra不太喜欢用),代码附上 1 const maxn=6200001; 2 type 3 link=^node; 4 node=record 5 t,d:longint; 6 f:link; 7 end; 8 var n,m,s,i,j,u,v,w,max:longint; 9 adj:array[0..3000] of link; 10 f:array[0..1000000] of longint; 11 d,val:array