新增乙個源點與匯點,建圖如下:
1. 源點 -> 每一行對應的點,流量限制為該行的和
2. 每一行對應的點 -> 每一列對應的點,流量限制為 k
3. 每一列對應的點 -> 匯點,流量限制為該列的和
求一遍最大流,若最大流與矩陣之和相等,說明有解,否則無解。判斷唯一解,是判斷殘量網路中是否存在乙個長度大於2的環,若存在說明有多解,否則有唯一解,解就是每條邊行i->列j的流量。
#include #include #include #include #include using namespace std;
const int maxn=500,maxm=maxn*maxn;
int next[maxm*2],num[maxm*2],r[maxm*2],a[maxn*2],row_sum[maxn],col_sum[maxn],n,m,k,tt,t,d[maxn*2],st[maxn*2],cod[maxn][maxn];
int h[maxn*2],vh[maxn*2];
bool don[maxm*2],in[maxn*2];
void insert(int x,int y,int rr)
void construct()
}}int dfs(int x,int y)
}minh=min(minh,h[num[st[x]]]+1);
if (h[0]>t) return 0;
}st[x]=next[st[x]];
if (st[x]==0) st[x]=a[x];
}while (sig!=st[x]);
if (vh[h[x]]--==0) h[0]=t+1;
vh[h[x]=minh]++;
return 0;
}int max_flow()
/*bool find_circle()
if (d[i]==0) q.push_back(i);
}int cnt=t+1;
while (!q.empty())}}
return cnt;
}*/bool visit(int x,int ed)
in[x]=false;
return false;
}bool find_circle()
}return false;
}void print_scheme()
}int main()
int sum=tmp;
for (int i=1;i<=m;i++)
if (tmp)
construct();
if (max_flow()
hdu 4888 最大流給出行列和求矩陣
第一步,考慮如何求是否有解。使用網路流求解,每一行和每一列分別對應乙個點,加上源點和匯點一共有n m 2個點。有三類邊 1.源點 每一行對應的點,流量限制為該行的和 2.每一行對應的點 每一列對應的點,流量限制為 k 3.每一列對應的點 匯點,流量限制為該列的和 對上圖做最大流,若源點出發的邊和到達...
hdu 4322 最大費用最大流)
思路 建圖真的是太巧妙了!直接copy大牛的了 由於只要得到糖就肯定有1個快樂度,在這一點上醣的效果是等效的。所以只要考慮有特殊效果的糖的分配就可以了。當快樂的程度超過b i 時,多出來的部分就浪費了,為了使浪費盡可能少,我們用費用流加以控制,當獲得最大費用最大流的時候,這是的費用的利用率就是最高的...
hdu 4322 Candy 最大費用最大流
很巧妙的建圖,沒有加成的糖對每個人都是一樣的所以建圖的時候只考慮加成的情況,以糖給人加的點數為費用,乙個人需要的點數為a則建一條由這個人指向匯的容量為a k費用為 k的邊,如果有餘數就再建一條容量為1費用為這個餘數的邊,由源向糖建邊,有加成效果的人和糖的組合之間連線,求這個圖的最小費用最大流即可。d...