題意:乙個無向圖,點帶權值,有源點s,匯點t,問最少拆出多少權值的點使st不連通(include s or t);
可以轉化為最大流問題,將每個點p拆分成 p與p',使p->p',邊權值賦為點權值,建邊(p,q)時只需連線(p',q),(q',p)邊權值為inf即可。
跑最大流是sap(2*st,2*ed+1,2*n),一開始想錯了
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define l(i) i<<1
#define r(i) i<<1|1
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100100
#define mod 1000000007
const int maxn = 100010;
const int maxm = 400010;
struct edge
edge[maxm];
int tot,n,m;
int head[maxn];
int gap[maxn],dep[maxn];
int pre[maxn],cur[maxn];
void init()
void add_edge(int u,int v,int w,int rw = 0)
int sap(int start,int en,int n)
u = start;
ans += min;
continue;
}int flag = 0;
int v;
for(int i = cur[u]; i != -1; i = edge[i].next)
}if(flag)
int min = n;
for(int i = head[u]; i != -1; i = edge[i].next)
if(edge[i].cap - edge[i].flow && dep[edge[i].to] < min)
gap[dep[u]]--;
if(!gap[dep[u]])
return ans;
dep[u] = min + 1;
gap[dep[u]]++;
if(u != start)
u = edge[pre[u]^1].to;
}return ans;
}int main()
for(int i = 0; i < m; i++)
printf("%d\n",sap(2*st,2*ed+1,2*n));
}return 0;
}
HDU 4289 Control 最小割,拆點
計畫將 從城市 s 運輸到城市 d 現在我們知道 s 和 d 知道城市網路中存在的路徑 無向邊 知道封鎖每個城市各自需要的代價,我們可以對任意城市進行封鎖,到達被封鎖的城市就會被抓捕,求抓捕所有 需要的最小代價。顯然這是乙個最小割問題,但代價是點權而不是邊權,所以需要對每個城市結點拆成入點和出點,入...
hdu 4289 最大流拆點
大致題意 給出乙個又n個點,m條邊組成的無向圖。給出兩個點s,t。對於圖中的每個點,去掉這個點都需要一定的花費。求至少多少花費才能使得s和t之間不連通。大致思路 最基礎的拆點最大流,把每個點拆作兩個點 i 和 i 連線i i 費用為去掉這個點的花費,如果原圖中有一條邊a b則連線a b。對這個圖求出...
hdu 5017 模擬退火求最值
題意 給乙個橢圓 然後求原點到這個橢圓距離最小的點的距離是多少。解析 依舊用模擬退火。修改了乙個地方,初始溫度從100改到了1,就行了。之前的也修改了。選z的時候,選離遠點近的那個點就行了。pragma comment linker,stack 1677721600 include include ...