很巧妙的建圖,沒有加成的糖對每個人都是一樣的所以建圖的時候只考慮加成的情況,以糖給人加的點數為費用,乙個人需要的點數為a則建一條由這個人指向匯的容量為a/k費用為-k的邊,如果有餘數就再建一條容量為1費用為這個餘數的邊,由源向糖建邊,有加成效果的人和糖的組合之間連線,求這個圖的最小費用最大流即可。d
#include#include#include#include#include#include#includeusing namespace std;
int n,m,k,b[15],d[50],size,par[50],ans,cmp;
bool like[15][15];
typedef struct aa
aa(){}
} edge;
edge edge[10000];
vectorg[50];
#define inf 100000000
void input()
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++) }
void add(int x,int y,int a,int b)
void es_map()
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
add(0,m+j,1,0);
}void init()
bool bfs()
; queueq;
q.push(0);
d[0]=0;
v[0]=1;
for(int i=1;i<=n+m+1;i++) d[i]=inf;
while(!q.empty())
}} }
return d[n+m+1]!=inf;
}bool bf()
flow+=f;
for(int i=x;i!=0;i=edge[par[i]].from)
if(n-flow-ans>=cmp) return 1;
} return n-flow-ans>=cmp;
}int main()
return 0;
}
hdu4322 Candy 最小費用最大流
題目描述 有n種糖果和m個小孩,每個小孩有乙個要求的愉悅度b i 給出乙個n m的like矩陣,若like i j 1說明i小孩喜歡j糖果,那麼如果 將j糖果分給i小孩則i小孩將獲得k點愉悅度,若like i j 0,那麼如果將i糖果分給j小孩,那麼i小孩將獲得1點愉悅度,求問有沒有糖果的分配方 案...
hdu 4322 最大費用最大流)
思路 建圖真的是太巧妙了!直接copy大牛的了 由於只要得到糖就肯定有1個快樂度,在這一點上醣的效果是等效的。所以只要考慮有特殊效果的糖的分配就可以了。當快樂的程度超過b i 時,多出來的部分就浪費了,為了使浪費盡可能少,我們用費用流加以控制,當獲得最大費用最大流的時候,這是的費用的利用率就是最高的...
HDU4862 Jump(最大流量最大費用流)
題意 有n m的格仔,每乙個格仔包含乙個數字,0 9。你初始的能量為0,你可以玩k次,每乙個你可以選擇你現在的格仔的正下方或者正右方的任意乙個格仔跳,但必須是之前沒有跳過的格仔。每玩一次你都可以跳任意次。每跳一次,從 x1,y1 到 x2,y2 你將花費 x1 x2 y1 y2 1的能量,如果起止格...