這道題目居然可以轉化為最小割。。實際上只要剝去題目中華(keng)麗(die)的外殼,就是乙個裸的最小割。
首先,這道題目中的終點一定是最高點。不妨考慮所有比終點高的點,將這些點的海拔都變為1,那麼答案顯然變小,同理起點一定是最低點,因此所有點的海拔範圍為[0,1]。
其次,需要剝去這道題目最大的乙個外殼,也就是海拔為小數這個絢(keng)麗(die)的條件。實際上乙個點的海拔不是0就是1。對於乙個點,顯然可以將它調整使它至少和周圍的乙個等高(這類似於在數軸上找乙個點使其到給定的n個點的距離與點權乘積的和最小,則這個點一定在某乙個給定的點處)。這樣經過不斷調整就會出現一種局面:即所有點分為兩個聯通塊,一塊全為0,包括起點;一塊全為1,包括中點。這樣,問題就轉化為最小割了(即兩個聯通塊之間的路徑需要被切斷,即割)。
於是就變成經典的平面圖最小割轉對偶圖最短路了,詳細的可以去網上搜尋bzoj1001的題解,原理是一樣的。
聽說spfa會被卡,不過好像也有寫過的。算了打個winnner tree不用stl裡面的堆作弊了(真無聊)。
ac**如下:
#include#include#include#define inf 1000000000
#define n 1300005
using namespace std;
int n,tot,c[n][2],val[n],fst[n],pnt[n],len[n],nxt[n],d[n],p[505][505];
bool vis[n];
int read()
return x;
}void add(int aa,int bb,int cc)
void build(int k,int l,int r)
}void ins(int k,int x,int y)
if (x<=mid) ins(k<<1,x,y); else ins(k<<1|1,x,y);
val[k]=min(val[k<<1],val[k<<1|1]);
}int qry(int k)
int solve(int sta,int gol){
int i,p; build(1,sta,gol);
for (i=sta; i<=gol; i++) d[i]=inf;
d[sta]=0; ins(1,sta,0);
for (i=0; i<=gol; i++){
int x=qry(1); d[x]=val[1];
if (x==gol) return d[x];
ins(1,x,inf); vis[x]=1;
for (p=fst[x]; p; p=nxt[p]){
int y=pnt[p]; if (vis[y]) continue;
if (d[x]+len[p]by lych
2016.1.22
BZOJ 1497 最小割應用
題意 基站耗費成本,使用者獲得利益 前提是投入成本 求最大獲利 最小割的簡單應用,所有可能的收益 消耗的成本 失去的收益 無窮大邊表示衝突,最小割求括號內的範圍即可 include include include include include include include include inc...
BZOJ 1797 最小割 最小割割邊唯一性判定
問題一 是否存在乙個最小代價路徑切斷方案,其中該道路被切斷?問題二 是否對任何乙個最小代價路徑切斷方案,都有該道路被切斷?現在請你回答這兩個問題。最小割唯一性判定 jcvb 在殘餘網路上跑tarjan求出所有scc,記id u 為點u所在scc的編號。顯然有id s id t 否則s到t有通路,能繼...
bzoj2561 最小生成樹 最小割
給定乙個邊帶正權的連通無向圖g v,e 其中n v m e n個點從1到n依次編號,給定三個正整數u,v,和l u v 假設現在加入一條邊權為l的邊 u,v 那麼需要刪掉最少多少條邊,才能夠使得這條邊既可能出現在最小生成樹上,也可能出現在最大生成樹上?第一行包含用空格隔開的兩個整數,分別為n和m 接...