踢足球

題目

問題描述
COS\text{COS}所在的FC\text{FC}幽寂即將與皇家鎢冀進行一場足球友誼賽。與一般的足球比賽1111人制不同,這場友誼賽兩隊各有nn位球員同時在場上奔跑,場面十分壯 (hun)觀(luan)。當然,球還是隻有一個。
現在,FC\text{FC}幽寂主教練卡犇要制定戰術。在進攻上,爲了保證團隊的協調有序,(直接)傳球必須在特定球員之間進行,方向不限。例如門將只會與最近的幾個後衛傳球。
受到個人能力和球員間默契的影響, 可直接傳球的兩個球員之間有一個特定的失誤係數,越大則表示越容易失誤。
不可直接傳球的兩個球員之間想要進行球的傳遞,則需通過其他球員來間接傳球(戰術已保證一個球員能直接或間接傳給其他任意球員) 。可直接傳球球員之間也可以間接傳球。
根據木桶原理,間接傳球的失誤係數等於傳球路線中所有直接傳球的最大的失誤係數。
在制定高級戰術過程中,卡犇需要知道兩名球員間傳球(包括直接和間接)可能達到的最小的失誤係數是多少。然而由於球員太多……
輸入輸出格式
輸入格式
第一行兩個正整數n,mn,m,分別表示FC\text{FC}幽寂隊場上球員數和可直接傳球的球員有多少對。
接下來nn行,每行一個字符串,分別表示每位球員姓名。
接下來mm行,每行兩個字符串s1,s2s1,s2和一個正整數kk,之間用一空格隔開,
表示名爲s1s1和名爲s2s2的兩個球員可以直接傳球,失誤係數爲kk
n+m+2n+m+2行一個正整數qq,表示卡犇的詢問數。
接下來qq行,每行兩個字符串s1,s2s1,s2,表示卡犇想知道名爲s1s1和名爲s2s2的兩個球員之間傳球可達的最小失誤係數。
數據沒有多餘的空格和回車。
輸出格式
qq行,每行一個正整數,依次表示每個詢問的答案。
數據範圍與約定
對於10%10\%的數據,n100,m103,q100n≤100,m≤10^3,q≤100
對於30%30\%的數據,n103,m103,q103n≤10^3,m≤10^3,q≤10^3
對於60%60\%的數據,n103,m105,q105n≤10^3,m≤10^5,q≤10^5
對於100%100\%的數據,n105,m105,q105n≤10^5,m≤10^5,q≤10^5,失誤係數108≤10^8,球員名字互不相同且長度不超過1010個字符。

思路

發現 任意兩個人之間的失誤係數一定是某個直接傳球的失誤係數,那麼就可以“枚舉”——將第jj大的直接傳球失誤係數叫做gjg_j,那麼x,yx,y兩個球員傳球,失誤係數爲gjg_j,當且僅當:
邊集是{gk1k<j}\{g_k|1\le k< j\}x,yx,y不連通;
邊集是{gk1kj}\{g_k|1\le k\le j\}x,yx,y連通。

那麼將邊排個序處理就好了!用並查集檢查。是不是很像Kruskal\text{Kruskal}?就建一個Kruskal\text{Kruskal}樹就好了!然後找lca\text{lca}就是板題了。

代碼

#include <cstdio>
int main(){
	printf("Reader orz or2 orz");
	printf("\n 聽了這麼多,代碼要自己寫 \n");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章