傳送門:【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 ...