洛谷 P1967 貨車運輸

2022-05-01 19:12:07 字數 1107 閱讀 7429

給定乙個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...