嘟嘟嘟
首先,每一輛貨車路徑唯一,說明應該求生成樹。又要滿足這條路的最小邊權最大,進一步得出要求最大生成樹。
求完最大生成樹上要解決的是樹上任意兩點之間的邊權的最小值,我第一反應是樹剖維護鏈上最小值,但其實我們用lca就可以了:對於任意兩點x, y, 維護x到lca(x, y)和y到lca(x, y)這兩條鏈上的最小值。時間複雜度o(nlogn)。
還有幾點要注意:
1.圖並不連通,所以對於每乙個沒遍歷過的點都要跑一遍lca。
2.好像沒啦。
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
namespace
std;
12#define enter puts("")
13#define space putchar(' ')
14#define mem(a, x) memset(a, x, sizeof(a))
15#define rg register
16 typedef long
long
ll;17 typedef double
db;18
const
int inf = 0x3f3f3f3f;19
const db eps = 1e-8;20
const
int maxn = 1e5 + 5;21
inline ll read()
2226
while(isdigit(ch))
27if(last == '
-') ans = -ans;
28return
ans;29}
30 inline void
write(ll x)
3136
37int
n, m, q;
38 vectorv[maxn], c[maxn];
39struct
edge
4046 }e[maxn * 5
];47
48int
p[maxn];
49void init(int
n)50
53int find(int
x)54
5758
bool
vis[maxn];
59int dep[maxn], fa[maxn][21], min[maxn][21
];60
void dfs(int
now)
6168
for(int i = 0; i < (int)v[now].size(); ++i)
6977}78
}79int lca(int x, int
y)80
90if(x == y) return
ret;
91for(int i = 20; i >= 0; --i)
9299
}100
return min(ret, min(min[x][0], min[y][0
]));
101}
102103
intmain()
104119
}120
for(int i = 1; i <= n; ++i) if(!vis[i]) dfs(i);
121 q =read();
122for(int i = 1; i <= q; ++i)
123128
return0;
129 }
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...