題意:給出一張有n個點的圖,有的邊又向,有的邊無向,現在要你破壞一些路,使得從點0無法到達點n-1。破壞每條路都有乙個代價。求在代價最小的前提下,最少需要破壞多少條道路。(就是說求在最小割的前提下,最小的割邊數)
解題思路:求最小割很好辦,跑一邊最大流即可,但關鍵是要求最小割邊數。這裡用到了乙個結論:最小割邊一定滿流,滿流的不一定是最小割邊。先跑一邊最大流,然後把滿流的邊容量設為1,其它邊容量設為inf,再跑一邊最大流即可。
自己寫的dinic超時了,用下別人的**吧。。
#include #include #include #include #define inf 1<<30
#define maxn 1010
#define maxm 500000
using namespace std;
int v[maxm],next[maxm],w[maxm];
int first[maxn],d[maxn],q[maxn];
int e,s,t;
void init()
void add_edge(int a,int b,int c)
int bfs()
}return 0;
}int dfs(int cur,int maxflow)
}return 0;
}int dinic()
return ans;
}int main()
dinic();
for(int i = 0;i < e;i += 2)else
}printf("case %d: %d\n",cas++,dinic());
}return 0;
}
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...
HDU 3987 最小割模型
讀完題後,就知道是最小割了,最小割 最大流,但是題目又說要最少邊的最小割,輸出邊的個數 這樣建邊得時候就要換種方式了,將邊權w變為w e 1 1,這時候求出的最大流實際上附帶了乙個資訊,就是邊的個數,最後的結果直接mod e 1 即可 id cugb wwj prog lang c include ...