第一步,考慮如何求是否有解。使用網路流求解,每一行和每一列分別對應乙個點,加上源點和匯點一共有n+m+2個點。有三類邊:
1. 源點 -> 每一行對應的點,流量限制為該行的和
2. 每一行對應的點 -> 每一列對應的點,流量限制為 k
3. 每一列對應的點 -> 匯點,流量限制為該列的和
對上圖做最大流,若源點出發的邊和到達匯點的邊全都滿流,則有解,否則無解。若要求構造方案,則 (i,j) 對應的整數就是行 i–> 列 j 的流量。
第二步,考慮解是否唯一。顯然,解唯一的充分必要條件是完成最大流後的殘餘網路沒有長度大於 2 的環。所以,判斷解的唯一性可使用dfs,注意遍歷的時候不可以在走完一條邊後馬上走其反向邊,加此限制檢查是否有環即可判斷解是否唯一。
至此,全題已解決
#include#include#includeusing namespace std;
#define inf 0x3fffffff
#define n 820
struct node bian[n*n*4];
int head[n],yong,dis[n],work[n];
void init()
void addbian(int u,int v,int w)
void add(int u,int v,int w)
int min(int a,int b)}}
return 0;
}int dfs(int s,int limit,int t)}}
return 0;
}int dinic(int s,int t)
return ans;
}int vis[n],ma[n][n],k;
int dfs(int u,int pre)
} vis[u]=0;
return 0;
}int judge(int n)
return 0;
}int main()
for(i=1;i<=m;i++)
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
add(i,j+n,k);
if(suma!=sumb)
f=dinic(s,t);
// printf("%d\n",f);
if(f!=suma)
if(judge(n))
printf("not unique\n");
else
for(i=1;i<=n;i++)
printf("\n");}}
}return 0;}
hdu 4888 最大流慢板
新增乙個源點與匯點,建圖如下 1.源點 每一行對應的點,流量限制為該行的和 2.每一行對應的點 每一列對應的點,流量限制為 k 3.每一列對應的點 匯點,流量限制為該列的和 求一遍最大流,若最大流與矩陣之和相等,說明有解,否則無解。判斷唯一解,是判斷殘量網路中是否存在乙個長度大於2的環,若存在說明有...
hdu 4322 最大費用最大流)
思路 建圖真的是太巧妙了!直接copy大牛的了 由於只要得到糖就肯定有1個快樂度,在這一點上醣的效果是等效的。所以只要考慮有特殊效果的糖的分配就可以了。當快樂的程度超過b i 時,多出來的部分就浪費了,為了使浪費盡可能少,我們用費用流加以控制,當獲得最大費用最大流的時候,這是的費用的利用率就是最高的...
hdu 4322 Candy 最大費用最大流
很巧妙的建圖,沒有加成的糖對每個人都是一樣的所以建圖的時候只考慮加成的情況,以糖給人加的點數為費用,乙個人需要的點數為a則建一條由這個人指向匯的容量為a k費用為 k的邊,如果有餘數就再建一條容量為1費用為這個餘數的邊,由源向糖建邊,有加成效果的人和糖的組合之間連線,求這個圖的最小費用最大流即可。d...