想要求貨車的最大載重量,根據木桶原理,我們就希望一條路徑上的載重量的最小值最大。讓一條路徑上的載重量的最小值最大,貪心得想,如果我加進去的每條邊都是剩餘邊中最大的那乙個,那麼在形成完整的通路時,一條路徑上的邊一定是所有情況中最大的那一種,這個思想很明顯就是最大生成樹。
lca找路徑求最小值就好了。
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int maxn=1e5+10;6
const
int inf=1e9;
7int
n,m;
8struct
edgeed[maxn];
11struct
nodepos[maxn];
14int
head[maxn],tot;
15void add(int u,int to,int
w)21
intfa[maxn];
22void
init()
25int find(int
x)29
void update(int x,int
y)33
bool
cmp(node x,node y)
36void
tree()45}
46}47int vis[maxn],dep[maxn],w[maxn][30],f[maxn][30
];48
void dfs(int
x)58}59
int lca(int x,int
y)68}69
if (x==y) return
ans;
70for (int i = 20;i>= 0;i--)76}
77 ans=min(ans,min(w[x][0],w[y][0
]));
78return
ans;79}
80int
main()
87tree();
88for (int i = 1;i <= n;i++)95}
96for (int i= 1;i <= 20;i++)
101}
102 scanf ("
%d",&q);
103for (int i = 1;i <= q;i++)
107return0;
108 }
另一道題uva11354 bond就是反過來,求最小生成樹,lca求最大值
noip2013貨車運輸
貨車運輸 truck.cpp c pas 問題描述 a 國有n座城市,編號從1到n,城市之間有 m條雙向道路。每一條道路對車輛都有重 量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的 情況下,最多能運多重的貨物。輸入 輸入檔名為truck.in。輸入檔案第一行有兩個...
NOIP 2013 貨車運輸
題目描述 description a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入描述 input description 第一行有兩個用乙個...
NOIP 2013 貨車運輸
題目大意 給定一張無向圖 以及若干個詢問 對於每個詢問求所有由節點u到節點v的路徑上邊權的最小值的最大值。題解 首先用構造一棵最大生成樹,這樣保證樹上兩個節點路徑邊權的最小值最大 在最大生成樹上兩個節點之間只有一條路徑,所以只需要找路徑上邊權的最小值 為了快速的尋找最小值,利用樹上倍增的想法用f j...