這題建圖自己想了半天搞不懂,然後看了一下別人的建圖。。。一臉茫然。。
最後去看了下胡波濤的《最小割模型在資訊學競賽的應用》裡面詳細的講解了將最大獲利問題轉換為最小割模型的過程。
建圖:源點與人連邊,容量為獲利。站點與匯點連邊,容量為耗資。然後是相應的人與其需求的站點連邊,容量為無窮。
這樣建圖就完成了,然後就是找最小割,即割邊上的值便為不能獲取的利潤值,用總值減去得出最大利潤。
#include#include#include#define maxn 60000 //點的個數
#define inf 1e8
#define min(a,b) (ab?a:b)
using namespace std;
struct edge
e[400050]; //邊的個數 記得乘2
int head[maxn],ecnt;
int gap[maxn],cur[maxn],pre[maxn],dis[maxn];
int l,r,mid;
int n,m,scr,sink,vn,num;
void insert(int u,int v,int w)
int sap(int s,int t,int n)//核心**(模版)
gap[s]=n;
bool flag;
while(dis[s]0&&dis[u]==dis[v]+1)
aug=inf;
}break;//找到一條就退出}}
if(flag) continue;
int mindis=n;
for(i=head[u];i!=-1;i=e[i].next)
{v=e[i].v;
if(e[i].w>0&&dis[v]
poj1459 網路流經典
題意 給幾個發電站,給幾個消耗站,再給幾個 點。發電站只發電,消耗站只消耗電,點只是 電,再給各個傳送線的傳電能力。問你消耗站能獲得的最多電是多少。思路 增加乙個超級源點,和超級匯點。把所給的發電站都和超級源點相連,把所給的消耗戰都和超級匯點相連。用ek求最大流。include include us...
UVA 1658(網路流經典拆點方法)
把每個點 除了1,n 之外拆成i和i1,兩點間連一條容量為1,費用為零的邊,這樣可以限定,每個點只被跑到一次,那麼之後跑乙個最流量為2的最小費用流就可以了。至於其他邊,流量設為1,保證每個邊只被跑到一次。pragma comment linker,stack 1024000000,102400000...
HDU 4292 網路流最大流
題目大意 有n個人,f的food,d的飲料,每個人對事物和飲料有偏好,並且如果乙個人沒有飲料或者事物他就會離開,問最後最多有幾個人留下來 題目解析 開始是超級食物匯點,中間是人,因為每個人最多選一種食物,所以人與自己也要加一條邊,最後是超級飲料匯點,最大流ek即可 ac include includ...