好坑啊!算了,還是怪我lca寫的不熟,沙茶一般把j
首先,我們可以生成一下最大生成樹,保證每個點都連通的情況下,每條路的限重盡量大。但是注意點並不一定都連通,因此我們需要建立多棵最大生成樹。然後我們的任務就是查詢兩點間路徑上的最小邊權,暴力的話複雜度難以接受,這是我們就可以使用一種較好的方法——倍增。說白了,就是在求lca的同時維護路徑上的最小邊權。初始化時,mine[i][0]=w[i][fan[i][0]];然後有mine[i][j]=min(mine[i][j-1],mine[fan[i][j-1]][j-1])。再就是建樹的過程容易出錯,應該注意。
1 #include2 #include3 #include4 #include5ac**using
namespace
std;
6 inline int min(int a,int b)
7 inline void swap(int& a,int& b)
8 inline int
get_num()
15void put_num(int
i) 20
const
int maxn=1e4+5,maxm=5e4+5,maxb=15,inf=0x3f3f3f3f;21
struct
edge
26} edge[maxm];
27int
fa[maxn],d[maxn],fan[maxn][maxb],mine[maxn][maxb];
28int f(int
i) 32
int dfs(int
v) 37
int query(int x,int
y) 51
return min(mmin,min(mine[x][0],mine[y][0
]));52}
53int
main()
60 sort(edge+1,edge+m+1
);61
for(int i=1;i<=n;++i) fa[i]=i;
62 memset(mine,inf,sizeof
(mine));
63for(int i=1;i<=m&&cnt1;++i)
67for(int i=1;i<=n;++i)
72for(int j=1;jj)
73for(int i=1;i<=n;++i)
77int q=get_num(),first=1;78
for(int i=1;i<=q;++i)
85return0;
86 }
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...