AHOI2008 緊急集合 聚會 題解

2021-08-28 02:48:18 字數 2286 閱讀 3223

歡樂島上有個非常好玩的遊戲,叫做「緊急集合」。在島上分散有n個等待點,有n-1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上(每個點同時允許多個人等待),每個人均帶有足夠多的遊戲幣(用於支付使用道路的花費)、地圖(標明等待點之間道路連線的情況)以及對話機(用於和同組的成員聯絡)。當集合號吹響後,每組成員之間迅速聯絡,了解到自己組所有成員所在的等待點後,迅速在n個等待點中確定乙個集結點,組內所有成員將在該集合點集合,集合所用花費最少的組將是遊戲的贏家。小可可和他的朋友邀請你一起參加這個遊戲,由你來選擇集合點,聰明的你能夠完成這個任務,幫助小可可贏得遊戲嗎?

輸入格式:

第一行兩個正整數n和m(n<=500000,m<=500000),之間用乙個空格隔開。分別表示等待點的個數(等待點也從1到n進行編號)和獲獎所需要完成集合的次數。 隨後有n-1行,每行用兩個正整數a和b,之間用乙個空格隔開,表示編號為a和編號為b的等待點之間有一條路。 接著還有m行,每行用三個正整數表示某次集合前小可可、小可可的朋友以及你所在等待點的編號。

輸出格式

一共有m行,每行兩個數p,c,用乙個空格隔開。其中第i行表示第i次集合點選擇在編號為p的等待點,集合總共的花費是c個遊戲幣。

輸入輸出樣例

輸入樣例#1:

6 4

1 2

2 3

2 4

4 5

5 6

4 5 6

6 3 1

2 4 4

6 6 6

輸出樣例#1:

5 2

2 5

4 1

6 0一道比較水的一道圖論題,我們先計算只有兩個點的情況,di

s=d[

u]+d

[v]−

2∗d[

lca(

u,v)

] dis

=d[u

]+d[

v]−2

∗d[l

ca(u

,v)]

,那麼來說有三個點的情況,我們來說三個點的情況,可以先求出兩點的lca,再求lca和另外乙個點的lca,然而第一步有三個lca,略有麻煩,通過手玩樣例,我們發現d最大的點就是答案,所以判斷那個點最深就可以做了。

上**

#include

#include

#include

#include

#include

#include

using

namespace

std;

int ver[1000010],nxt[1000010],hed[500010],tot,f[500010][25],d[500010],t,n,t;

queue

q;inline

void add(int x,int y)

inline

void bfs()

}}inline

int lca(int x,int y)

if(x==y)

return x;

for(int i=t;i>=0;i--)

if(f[x][i]!=f[y][i])

x=f[x][i],y=f[y][i];

return f[x][0];

}inline

int readn()

return x;

}inline

bool pd(int x,int y,int z,int fa)

if(d[x]>=d[z])

for(int i=t;i>=0;i--)

if(d[x]<=d[f[y][i]])

y=f[y][i];

for(int i=t;i>=0;i--)

if(d[x]<=d[f[z][i]])

z=f[z][i];

if((x==y)||(x==z))

return

1; return0;}

int main()

if(d[qbq]>=d[qcq])

printf("%d %d\n",qbq,d[a]+d[b]+d[c]-d[qbq]-2*d[lca(qbq,a)]);

else

printf("%d %d\n",qcq,d[a]+d[b]+d[c]-d[qcq]-2*d[lca(qcq,b)]);

}return

0;}

AHOI2008 緊急集合 聚會

歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...

AHOI2008 緊急集合 聚會

歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...

AHOI2008 緊急集合 聚會

歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...