COGS——T1588. [USACO FEB04]距离咨询

http://cogs.pro/cogs/problem/problem.php?pid=1588

★★   输入文件:dquery.in   输出文件:dquery.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

农夫约翰有N(2<=N<=40000)个农场,标号1到N。M(2<=M<=40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的地图一样,图中农场用F1..F7表示:

每个农场最多能在东西南北四个方向连结4个不同的农场。此外,农场只处在道路的两端。道路不会交叉而且每对农场间有且仅有一条路径。邻居鲍伯要约翰来导航,但约翰丢了农场的地图,他只得从电脑的备份中修复率。每一条道路的信息如下:

从农场23往南经距离10到达农场17

从农场1往东经距离7到达农场17

. . .

最近美国过度肥胖非常普遍。农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松。马拉松路线要尽量长。

奶牛们拒绝跑马拉松,因为她们悠闲的生活无法承受约翰选择的如此长的赛道。因此约翰决心找一条更合理的赛道。他打算咨询你。读入地图之后会有K个问题,每个问题包括2个整数,就是约翰感兴趣的2个农场的编号,请尽快算出这2个农场间的距离。

【输入格式】

第1行:两个分开的整数N和M。

第2到M+1行:每行包括4个分开的内容,F1,F2,L,D分别描述两个农场的编号,道路的长度,F1到F2的方向N,E,S,W。

第2+M行:一个整数K(1<=K<=10000).

第3+M到2+M+K行:每行输入2个整数,代表2个农场。

【输出格式】

对每个问题,输出单独的一个整数,给出正确的距离。

【样例输入】

7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
3
1 6
1 4
2 6

【样例输出】

13
3
36

【提示】

农场2到农场6有20+3+13=36的距离。

【来源】

Brian Dean,2004

USACO 2004 February Contest Green Problem 3 Distance Queries

方向 没用

裸最短路 超时

用dis[i]记录i到根的距离,ans=dis[u]+dis[v]-2*dis[lca[u,v]] 画个图就能看出来了

模板题

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <queue>
 5
 6 using namespace std;
 7
 8 const int N(40000+15);
 9 int n,m,u,v,w,k;
10 char ch;
11
12 int head[N],sumedge,cnt;
13 struct Edge
14 {
15     int u,v,w,next;
16     Edge(int u=0,int v=0,int next=0,int w=0):
17         u(u),v(v),next(next),w(w){}
18 }edge[N<<1],e[N<<1];
19 void Insert(int u,int v,int w)
20 {
21     edge[++sumedge]=Edge(u,v,head[u],w);
22     head[u]=sumedge;
23 }
24
25 int size[N],deep[N],top[N],dad[N],dis[N];
26 void DFS(int x)
27 {
28     size[x]=1; deep[x]=deep[dad[x]]+1;
29     for(int i=head[x];i;i=edge[i].next)
30     {
31         int to=edge[i].v;
32         if(dad[x]==to) continue;
33         dad[to]=x;dis[to]+=dis[x]+edge[i].w;DFS(to);size[x]+=size[to];
34     }
35 }
36 void DFS_(int x)
37 {
38     int t=0; if(!top[x]) top[x]=x;
39     for(int i=head[x];i;i=edge[i].next)
40     {
41         int to=edge[i].v;
42         if(dad[x]!=to&&size[t]<size[to]) t=to;
43     }
44     if(t) top[t]=top[x],DFS_(t);
45     for(int i=head[x];i;i=edge[i].next)
46     {
47         int to=edge[i].v;
48         if(dad[x]!=to&&to!=t) DFS_(to);
49     }
50 }
51 int LCA(int x,int y)
52 {
53     for(;top[x]!=top[y];x=dad[top[x]])
54         if(deep[top[x]]<deep[top[y]]) swap(x,y);
55     return deep[x]<deep[y]?x:y;
56 }
57
58 int main()
59 {
60     freopen("dquery.in","r",stdin);
61     freopen("dquery.out","w",stdout);
62
63     scanf("%d%d",&n,&m);
64     for(;m;m--)
65     {
66         scanf("%d%d%d %c",&u,&v,&w,&ch);
67         e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;
68         Insert(u,v,w);Insert(v,u,w);
69     }
70     DFS(1);DFS_(1);
71     scanf("%d",&k);
72     for(;k;k--)
73     {
74         scanf("%d%d",&u,&v);
75         printf("%d\n",dis[u]+dis[v]-(dis[LCA(u,v)]<<1));
76     }
77     return 0;
78 }
时间: 2024-08-02 19:19:15

COGS——T1588. [USACO FEB04]距离咨询的相关文章

usaco feb04距离咨询

[USACO FEB04]距离咨询 成绩   开启时间 2014年09月19日 星期五 10:08 折扣 0.8 折扣时间 2014年09月26日 星期五 10:08 允许迟交 是 关闭时间 2014年09月26日 星期五 10:08 输入文件 dquery.in 输出文件 dquery.out [题目描述] 农夫约翰有N(2<=N<=40000)个农场,标号1到N.M(2<=M<=40000)条的不同的垂直或水平的道路连结着农场,道路的长度不超过1000.这些农场的分布就像下面的

cogs 133. [USACO Mar08] 牛跑步 A*算法

by http://blog.csdn.net/jarily/article/details/8871968/* *算法引入: *在单源点最短路径问题中,实际运用时还需知道最短路径外,次短路或者第三短路; *即要知道多条最短路,并排出其长度增加的顺序,即为K最短路问题; * *算法思想: *单源点最短路径+高级搜索A*; *A*算法结合了启发式方法和形式化方法; *启发式方法通过充分利用图给出的信息来动态地做出决定而使搜索次数大大降低; *形式化方法不利用图给出的信息,而仅通过数学的形式分析;

匈牙利算法 cogs 886. [USACO 4.2] 完美的牛栏

886. [USACO 4.2] 完美的牛栏 ★★☆   输入文件:stall4.in   输出文件:stall4.out   简单对比时间限制:1 s   内存限制:128 MB USACO/stall4(译by Felicia Crazy) 描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶.上个星期,农夫约翰刚刚收集到了奶

COGS 147. [USACO Jan08] 架设电话线

★★☆   输入文件:phoneline.in   输出文件:phoneline.out   简单对比时间限制:1 s   内存限制:16 MB Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废弃的电话线杆,任意两根电话线杆间都没有电话线相连.一共P(1 <= P <= 10,000)对电话线杆间可以拉电话线,其余的那些

算法优化(动态规划):COGS 2009. [USACO Mar09]餐厅清扫

2009. [USACO Mar09]餐厅清扫 ★★☆   输入文件:cleanup.in   输出文件:cleanup.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 很久很久以前,Framer John只会做一种食品:而现在John能给他的N(1<=N<=40000)只奶牛供应M(1<=M<=N)种不同的食品.奶牛们非常挑剔,i号奶牛只吃食品Pi(1<=Pi<=M). 每天,奶牛们按编号排队进自助餐厅用餐.不幸的是,这么多各类的食品让

cogs 181. [USACO Jan07] 最高的牛

181. [USACO Jan07] 最高的牛 ★★   输入文件:tallest.in   输出文件:tallest.out   简单对比时间限制:1 s   内存限制:32 MB FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told

cogs 1435. [USACO NOV]金发姑娘和N头牛

1435. [USACO NOV]金发姑娘和N头牛 ★★☆   输入文件:milktemp.in   输出文件:milktemp.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 你可能已经听说了金发姑娘和3只熊的经典故事. 鲜为人知的是,金发姑娘最终经营了一个农场.在她的农场,她有一个谷仓含N头奶牛(1<=N <= 20000).不幸的是,她的奶牛对温度相当敏感. 第i头奶牛必须在指定的温度范围内A(i)..B(i)才感觉舒适:(0<=A(i)<=B

cogs 182. [USACO Jan07] 均衡队形 线段树

182. [USACO Jan07] 均衡队形 ★★☆   输入文件:lineup.in   输出文件:lineup.out   简单对比时间限制:4 s   内存限制:128 MB 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比赛.为简化问题,他将从奶牛队列中选出一个连续区间来进行游戏.不过,参加游戏的奶牛要玩的开心的话就不能在身高上差距太大. 农夫约翰制定了 Q (1 ≤ Q ≤ 200,0

cogs 397. [USACO Oct09] 热浪

传送门 ★☆   输入文件:heatwvx.in   输出文件:heatwvx.out   简单对比 时间限制:1 s   内存限制:128 MB 第九題: 熱浪 [300分] [Rob Kolstad (傳統題目), 2009] 德克薩斯純樸的民眾們這個夏天正在遭受巨大的熱浪!!!他們的德克薩斯長角牛吃起來不錯,可是他們並不是很擅長生產富含奶油的乳製品.Farmer John此時以先天下之憂而憂,後天下之樂而樂的精神,身先士卒地承擔起向德克薩斯運送大量的營養冰涼的牛奶的重任,以減輕德克薩斯人忍