HDU 3987 最小割模型

2021-08-26 19:45:39 字數 1450 閱讀 9602

讀完題後,就知道是最小割了,最小割=最大流,但是題目又說要最少邊的最小割,輸出邊的個數

這樣建邊得時候就要換種方式了,將邊權w變為w *(e + 1) + 1,這時候求出的最大流實際上附帶了乙個資訊,就是邊的個數,最後的結果直接mod (e+1 )即可

/*

id: cugb-wwj

prog:

lang: c++

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define inf 11111111111111ll

#define maxn 1005

#define maxm 444444

#define pi acos(-1.0)

using namespace std;

struct node

edge[maxm];

long long dist[maxn];

int numbs[maxn], src, des, n, m;

int head[maxn], e;

void add(int x, int y, long long c)

void rev_bfs()

q[qtail++] = des;

dist[des] = 0;

numbs[0] = 1;

while(qhead != qtail)

}}long long maxflow()

totalflow += augflow;

u = src;

}int i;

for(i = curhead[u]; i != -1; i = edge[i].next)

if(edge[i].cap > 0 && dist[u] == dist[edge[i].ver] + 1)break;

if(i != -1) // find an admissible arc, then advance

else // no admissible arc, then relabel this vertex

}return totalflow;

}void init()

int main()

src = 1;

des = n;

rev_bfs();

long long ans = maxflow() % 222222ll;

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

}return 0;

}

hdu 3987 最小割的邊數

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

hdu 3987 求割邊最少的最小割

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

hdu 3987 求割邊最少的最小割

割邊必然是滿流的邊 方法一 重新建圖,將滿流的邊改為容量為1,非滿流的邊改為容量為inf。再跑一邊最大流就是割邊的個數。要注意的是,改圖的時候,應該對正向邊進行判斷,cap 0則為滿流 方法二 建圖時,每條邊的cap cap e 1 1,則最後的最小割就是max flow e 1 割邊的個數就是ma...