傳送藥水
(喝了這一壺傳送藥水,保你看了什麼題都覺得神清氣爽)
這題不算水。
首先想到,肯定需要跑一遍最大生成樹,因為我們需要盡可能大的限制。
那麼,接下來就是求兩點之間最小限制。
那麼就是我們就可以用求lca(最近公共祖先)來解決這個問題。
所以就倍增好了。
我們這裡倍增的有兩個陣列,乙個是祖先,另乙個是當前點到祖先的路上的最小限制。
最後理一遍思路:
先kruskal建立乙個最大樹(圖)。
然後bfs建立乙個樹,處理一些基本資料。
然後就用倍增求lca來解決就好了。
**如下:
#include
#include
#include
#include
#include
using
namespace
std;
struct edge;
int n,m;
int p[10005];
edge e[50005];
int f[10005][21],deep[10005];
int g[10005][21];
int vis[10005];
vector
g[10005],h[10005];
//int fa[10005];
int ques;
int find(int xx)
int cmp(edge a,edge b)
void kruscal()
for(int i=0;iint xx=find(e[i].u),yy=find(e[i].v);
if(xx!=yy)
}}void bfs()}}
}void init()}}
}int ans;
int jump(int u,int step)
void lca(int u,int v)
}ans=u==v?ans:min(min(ans,g[u][0]),g[v][0]);
}int main()
for(int i=0;iint ww;
scanf("%d%d%d",&e[i].u,&e[i].v,&ww);
e[i].w=max(e[i].w,ww);
}kruscal();
bfs();
init();
scanf("%d",&ques);
while(ques--)
if(find(u)!=find(v))elseelse}}
return
0;}
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...