給定乙個n個點m條邊的無向帶權圖,每次詢問2點u,v的聯通情況,不聯通則輸出-1。
如果聯通,不妨將一條聯通u,v的路徑上的最小權值記為w,則該次詢問輸出所有可能的w中的最大值。
共有q次詢問。
對於任意兩點u&v,我們需要找出能使得w最大的一條最優路徑。
因此需要生成乙個新圖,使得原圖中聯通任意兩點之間只存在一條能使得w最大的最優路徑。
因此這是一棵樹……
又因為要使w最大,應盡量選擇邊權大的邊作為路徑…… 然後就突然發覺:這不就是kruskal演算法的過程嗎?只不過最小生成樹優先選擇邊權小的邊,此時優先選擇邊權大的。
因此要求的新圖就是一顆最大生成樹……kruskal可破。
然後就是求任意兩點lca了。此處使用倍增,也方便維護某節點向樹根爬的時候路上的最小權值。
(用樹鏈剖分+線段樹維護也行…………)
更具體的看**注釋。
#includeusing namespace std;
#define inf 1000000005
struct node
void uni(int a,int b) //合併a,b所在集合
void add(int u,int v,int w) //新增新圖邊
void dfs(int u,int f,int k)//dfs,u代表當前點,f為當前點父親,k為深度
if (x==y) return ans;
for(int i=20; i>=0; i--)//讓x,y一起跳到lca節點下方
if(fas[x][i]!=fas[y][i])
ans=min(ans,min(minw[x][0],minw[y][0]));//統計最小邊權
return ans;
}int main()
kruskal();//最大生成樹
for (int i=1;i<=n;i++)
}for (int i=1;i<=20;i++)
}scanf("%d",&q);
for (int i=1;i<=q;i++)
return 0;
}
洛谷 P1967 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 ...
洛谷 P1967 貨車運輸
題目描述 a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入輸出格式 輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔...
貨車運輸 洛谷p1967
解法一 30分 直接跑spfa,求最大瓶頸路。include include include define f i,l,r for i l i r i using namespace std const int maxn 10005,maxm 50005,inf 100000000 struct e...