3361: [Usaco2004 Jan]培根距离

3361: [Usaco2004 Jan]培根距离

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 16  Solved: 13
[Submit][Status][Discuss]

Description

贝茜和其他奶牛联系是通过一连串的中间奶牛传递的,所以当第一头牛和贝茜联系,第二头牛和第一头牛联系,第三头牛和第二头牛联系,…一贝茜就能依次联系到其中的每一头奶牛. 联系长度是指传递过程中涉及的奶牛的数目(不包括贝茜).任何一头奶牛(不包括贝茜)的培根距离是指从贝茜到该奶牛的最小联系长度.最小的培根距离是1(当贝茜能够直接与该奶牛联系时).约输有C头牛,编号1到C,贝茜是1号.有P(1≤P≤10000)组奶牛相互联系.请找到最大的培根距离.

Input

第1行:C和P.

第2到P+1行:每行两头牛,它们之间有联系.

Output

输出最大培根距离.

Sample Input

6 7
1 2
2 3
2 4
3 4
3 5
4 5
6 5

Sample Output

4
样例说明
从贝茜到6奶牛的距离是4.联系路径(2,4,5,6)和(2,3,5,6)都适合

HINT

Source

Orange

题解:spfa模板题,水水哒

在这个里面加入了一个新的优化方法,昨天在wnjxyk的空间里面看到的(OTLwnjxyk),在spfa入队前,可以在队列内的值进行判重操作,这样子可以提高速度,而且必要时可以起到压缩队列所用空间的作用,可以将队列有效长度控制在N以内,这样子必要时只需要开一个循环队列即可解决空间问题,GET!!!(OTLwnjxyk)

 1 type
 2         point=^node;
 3         node=record
 4                 g,w:longint;
 5                 next:point;
 6         end;
 7 var
 8         i,j,k,l,m,n,f,r:longint;
 9         p:point;
10         a:array[0..100000] of point;
11         b,c:array[0..100000] of longint;
12         d:array[0..1000000] of longint;
13 procedure add(x,y,z:longint);inline;
14         var p:point;
15         begin
16                 new(p);p^.g:=y;p^.w:=z;
17                 p^.next:=a[x];a[x]:=p;
18         end;
19 begin
20         readln(n,m);
21         for i:=1 to n do a[i]:=nil;
22         for i:=1 to m do
23                 begin
24                         readln(j,k);
25                         add(j,k,1);add(k,j,1);
26                 end;
27         fillchar(b,sizeof(b),0);
28         fillchar(c,sizeof(c),0);
29         fillchar(d,sizeof(d),0);
30         f:=1;r:=2;
31         d[1]:=1;c[1]:=1;b[1]:=1;
32         while f<r do
33                 begin
34                         p:=a[d[f]];
35                         while p<>nil do
36                                 begin
37                                         if ((b[p^.g]=0) or ((b[p^.g]=1) and (b[p^.g]>(b[d[f]]+p^.w)))) and (c[p^.g]=0) then
38                                                 begin
39                                                         b[p^.g]:=b[d[f]]+p^.w;
40                                                         c[p^.g]:=1;
41                                                         d[r]:=p^.g;
42                                                         inc(r);
43                                                 end;
44                                         p:=p^.next;
45                                 end;
46                         c[d[f]]:=0;
47                         inc(f);
48                 end;
49         for i:=1 to n do dec(b[i]);
50         l:=0;
51         for i:=1 to n do if b[i]>l then l:=b[i];
52         writeln(l);
53 end.
时间: 2024-11-05 22:52:21

3361: [Usaco2004 Jan]培根距离的相关文章

BZOJ 3361 [Usaco2004 Jan]培根距离

SPFA裸题,练手练手~ #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; int const maxn = 2*10005; struct node{ int u,v,w,next; node(){} node(int _u,int _v,int _w,int _next){ u = _u; v = _v; w =

3359: [Usaco2004 Jan]矩形

3359: [Usaco2004 Jan]矩形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 8  Solved: 5[Submit][Status][Discuss] Description 给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得 有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个 矩形P2,则P2的一边小于P1的一边,并且P9的另一边不超过P1的另一边.如

3360: [Usaco2004 Jan]算二十四

3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Status][Discuss] Description 写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括 号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数. Input 第1行:一个整数D. 第2到D+1行:D个整数,在1到50之间. O

BZOJ 3359: [Usaco2004 Jan]矩形( dp )

数据范围这么小..怎么乱搞都可以吧... 先排序一遍然后O(n²) dp ------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; const int maxn = 109; struct R { int x, y; inline void Read() { scanf("%d%d", &x, &

BZOJ3355 : [Usaco2004 Jan]有序奶牛

对于一条边x->y,若去掉之后x不能到达y,那么它是必需的. 首先拓扑排序求出拓扑序,然后按照终点拓扑序为第一关键字,起点拓扑序为第二关键字从小到大加边. 对于每个点,维护一个bitset,表示当前从哪些点可以到达自己. 时间复杂度$O(\frac{nm}{32})$. #include<cstdio> #include<bitset> #include<algorithm> using namespace std; typedef pair<int,int

[bzoj3360] [Usaco2004 Jan]算二十四

O(3^9)枚举符号.. 成功垫底QAQ...幸好没破坏这题100%的AC率.. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int l[11],r[11]; 6 int fh[11],num[11],a[11]; 7 int i,j,k,n,m,ans; 8 9 int ra;char rx; 10 inline int read(){ 11

BZOJ3356 : [Usaco2004 Jan]禁闭围栏

首先将坐标离散化,考虑从左往右扫描线 碰到插入操作则插入 碰到删除操作的: 当前包含i的矩形数=y1在[1,y2[i]]之间的矩形数-y2在[1,y1[i]-1]之间的矩形数 用两棵树状数组维护即可,时间复杂度$O(n\log n)$. #include<cstdio> #include<algorithm> #define N 500010 int n,m,i,x1,y1,x2,y2,b[N],bl[N],br[N],now,ans=-1,cnt; struct P{int x,

BZOJ3355

3355: [Usaco2004 Jan]有序奶牛 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 37  Solved: 19[Submit][Status][Discuss] Description 约翰的N(1≤N≤1500)头牛排成一行挤奶时,有确定的顺序.牛被编成连续的号码1..N,他拥有L条关于奶牛顺序的信息,所有的信息都写成"A在B的前面"这样的形式,而且他知道最后一条是多余的.他觉得,有些冗余信息可以由其他信息推出,可以对

BZOJ 3364: [Usaco2004 Feb]Distance Queries 距离咨询

Description 一棵树,询问两点间距离. Sol 倍增. 方向没用. 没有然后了. Code /************************************************************** Problem: 3364 User: BeiYu Language: C++ Result: Accepted Time:400 ms Memory:11556 kb **************************************************