HDU 3491 Thieves 最小點割集

2021-06-23 00:20:50 字數 1488 閱讀 5035

傳送門:【hdu】3491 thieves

題目分析:無向圖建成有向圖= =||。。。。本題這麼簡單竟然還錯了這麼多次。。。

反正就是乙個點x拆成兩個點x,x',建邊,容量為點權。然後有邊(u,v)則建邊(u',v),(v',u),容量為無窮大。

然後跑最大流就好了。。。比較坑爹的是題目明明說了輸出換行!!但是事實是不用輸出= =||

**如下:

#include #include #include using namespace std ;

#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )

#define rev( i , a , b ) for ( int i = a - 1 ; i >= b ; -- i )

#define for( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define fov( i , a , b ) for ( int i = a ; i >= b ; -- i )

#define clr( a , x ) memset ( a , x , sizeof a )

#define cpy( a , x ) memcpy ( a , x , sizeof a )

const int maxn = 250 ;

const int maxq = 250005 ;

const int maxe = 250005 ;

const int inf = 0x3f3f3f3f ;

struct edge

edge ( int v , int c , int n ) : v ( v ) , c ( c ) , n ( n ) {}

} ;struct network

void addedge ( int u , int v , int c )

void rev_bfs ()

} }int isap ()

for ( i = s ; i != t ; i = e[cur[i]].v )

flow += f ;

u = pos ;

}for ( i = cur[u] ; ~i ; i = e[i].n )

if ( e[i].c && d[u] == d[e[i].v] + 1 )

break ;

if ( ~i )

else

d[u] = mmin + 1 ;

num[d[u]] ++ ;

u = pre[u] ;

}} return flow ; }

void solve ()

rep ( i , 0 , m )

isap () ;

printf ( "%d\n" , flow ) ;

}} x ;

int main ()

return 0 ;

}

hdu 3491 Thieves 最小割拆點

題意 有n個城市和m條道路 雙向 一夥小偷準備從s城出發到h城盜竊,為了將這夥小偷抓住,需要在這n個城市中的每乙個城市安排一定數量的警察 每個城市警察的數量已經給出 但警察不希望在s城或h城遇到小偷.求解總共需要的最少警察數.由於每個城市頂點都具有權值,所以對於每個城市拆成兩個點u和所對應的u 之間...

HDU3491最小割拆點

這道題就是乙個最小割,不過由於給出的是點的容量所以採用拆點連邊,這樣就把乙個點拆成連個點然後其邊容量為點容量。之後建圖的時候是雙向邊把拆出的點 i n 連到下個點就好,然後就是最大流。include include include include include using namespace st...

流量最小HDU 3491 最小割

在寫這篇文章之前,已經寫過了幾篇關於改流量最小主題的文章,想要了解的朋友可以去翻一下之前的文章 題意 有n個都會,每乙個都會有定一數量的察警,有一群小偷,從都會s,到t,問起碼須要多少察警可以使小偷到不了t都會。將每乙個都會的察警數量當作流量,那麼題問就轉化成求s t的最小割。將每乙個點拆成i i ...