hdu 3987 求割邊最少的最小割

2021-07-15 13:13:40 字數 1381 閱讀 1778

割邊必然是滿流的邊

方法一:

重新建圖,將滿流的邊改為容量為1,非滿流的邊改為容量為inf。再跑一邊最大流就是割邊的個數。

(要注意的是,改圖的時候,應該對正向邊進行判斷,cap == 0則為滿流)

方法二:

建圖時,每條邊的cap = cap*(e+1) + 1,則最後的最小割就是max_flow / (e+1) ,割邊的個數就是max_flow%(e+1)

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int m_node = 1090,m_edge = 500009,inf = 0x3f3f3f3f;

struct edge

edge[m_edge],edge2[m_node];

int head[m_node],level[m_node];

int pre[m_node];

int tot;

int n,m;

int s,t;

int ss,tt;

int vis[m_node];

void init()

void add_edge(int u,int v,int cap)

bool bfs(int s,int t)}}

return level[t] != -1;

}int dfs(int v,int t,int f)}}

level[v] = -1;

return0;}

int max_flow(int s,int t)

return flow;

}int main()

else add_edge(u,v,cost);

}s = n;

t = n + 1;

add_edge(s,0,inf);

add_edge(n-1,t,inf);

int ans = max_flow(s,t);

//printf("debug ---- ans = %d\n",ans);

for(int i = 0;i < n;i++)

else

if(edge[j].is_rev == false)

//add_edge(t+1+i,t+1+edge[j].to,inf);}}

ans = max_flow(s,t);

printf("case %d: %d\n",kas++,ans);

}return

0;}

hdu 3987 求割邊最少的最小割

題目是求邊數最少的最小割集。網上看到了兩種方法,粘一下。第一種 建邊的時候每條邊權 w w e 1 1 這樣得到最大流 maxflow e 1 最少割邊數 maxflow e 1 道理很簡單,如果原先兩類割邊都是最小割,那麼求出的最大流相等 但邊權變換後只有邊數小的才是最小割了 乘 e 1 是為了保...

hdu 3987 最小割的邊數

題意 給出一張有n個點的圖,有的邊又向,有的邊無向,現在要你破壞一些路,使得從點0無法到達點n 1。破壞每條路都有乙個代價。求在代價最小的前提下,最少需要破壞多少條道路。就是說求在最小割的前提下,最小的割邊數 解題思路 求最小割很好辦,跑一邊最大流即可,但關鍵是要求最小割邊數。這裡用到了乙個結論 最...

HDU 3987 最小割模型

讀完題後,就知道是最小割了,最小割 最大流,但是題目又說要最少邊的最小割,輸出邊的個數 這樣建邊得時候就要換種方式了,將邊權w變為w e 1 1,這時候求出的最大流實際上附帶了乙個資訊,就是邊的個數,最後的結果直接mod e 1 即可 id cugb wwj prog lang c include ...