洛谷 P1967 貨車運輸

2021-10-03 18:28:32 字數 2114 閱讀 1629

題目描述

a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。

現在有 q 輛貨車在運輸貨物, 司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。

輸入格式

第一行有兩個用乙個空格隔開的整數 n,m 表示 a 國有 n 座城市和 m 條道路。

接下來 m 行每行三個整數 x, y, z 每兩個整數之間用乙個空格隔開,表示從 x 號城市到 y 號城市有一條限重為 z 的道路。

注意:兩座城市之間可能有多條道路 。

接下來一行有乙個整數 q,表示有 q 輛貨車需要運貨。

接下來 q 行,每行兩個整數 x,y,之間用乙個空格隔開,表示一輛貨車需要從 x 城市運輸貨物到 y 城市,保證 x!=y

輸出格式

共有 q 行,每行乙個整數,表示對於每一輛貨車,它的最大載重是多少。

如果貨車不能到達目的地,輸出 -1。

人話題意:給任意兩個點,求這兩個點的簡單路徑上的邊權最小值

首先貪心一下,建乙個最大生成樹,然後由於(一定)資料給的是森林,所以、應該從每個點都搜尋一遍

之後用倍增的方法更新路上最小權值即可(我也不知到為啥我的只有用氧氣優化才能過qaq

#include

#include

#include

#define fo(i) for(int i=1;i<=q;i++)

#define for(i) for(int i=1;i<=n;i++)

using

namespace std;

const

int m=

200005

;const

int n=

10005

;const

int inf=

2147483640

;int n,m,tot,head[m]

,q,cnt,fa[n]

,nex[m]

,to[m]

,v[m]

;int f[n][30

],w[n][30

];bool vis[n]

;struct node

}bian[m]

;struct nodedian[n]

;inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}void

print

(int x)

if(x>9)

putchar

(x%10

+'0');

}inline

void

add(

int x,

int y,

int z)

intfind

(int x)

inline

void

kruskal()

if(p==n-1)

return;}

}void

dfs(

int x)

}return;}

intlca

(int x,

int y)}if

(x==y)

return ans;

for(

int i=

20;i>=

0;i--)}

ans=

min(ans,

min(w[x][0

],w[y][0

]));

return ans;

}int

main()

sort

(bian+

1,bian+m+1)

;kruskal()

;for

(int i=

1;i<=n;i++)}

for(

int i=

1; i<=

20; i++

)for

(int j=

1; j<=n; j++)

q=read()

;fo(i)return0;

}

洛谷 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...