這道題其實思路很顯然,就是最大生成樹加倍增。
我們來順著**講一遍。
我們先讀入n和m
然後把所有邊的權值設定為0
讀入時,重複的邊只取最大(很顯然)
然後kruscal進行最大生成樹,用g和h兩個vector分別去儲存邊和權值
然後倍增即可。
具體看**:
#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];//f表示節點u的k級祖先,deep是深度
int g[10005][21];//表示節點u到u的k級祖先上最小權值
int vis[10005]; //用於bfs
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...