每一行/列至少取a/b的最小費用=sum-每一行/列至多取m-a/n-b的最大費用
由於是求可行流而不是最大流,所以新增超級源匯,在源匯上連一條分流的路
#include#include#include#include#include#includeusing namespace std;
#define ll __int64
int n,m;
const int n = 110;//點
const int m = 2 * 3000;//邊
const int inf = 1000000000;
struct nodee[m];
int next1[m], point[n], dis[n], q[n], pre[n], ne;//ne為已新增的邊數,next,point為鄰接表,dis為花費,pre為父親節點
bool u[n];
void init()
void add_edge(int f, int t, int d1, int d2, int w)
bool spfa(int s, int t, int n)
}} }
if(pre[t] == -1)
return false;
return true;
}void mcmf(int s, int t, int n, int &flow, int &cost)
tmp = t;
while(tmp != s)
flow += arg;
cost += arg * dis[t]; }}
//建圖前執行init()
//節點下標從0開始
//加邊時執行add_edge(a,b,c,0,d)表示加一條a到b的流量為c花費為d的邊(注意花費為單位流量花費)
//特別注意雙向邊,執行add_edge(a,b,c,0,d),add_edge(b,a,c,0,d)較好,不要只執行一次add_edge(a,b,c,c,d),費用會不對。
//求解時代入mcmf(s,t,n,v1,v2),表示起點為s,終點為t,點數為n的圖中,最大流為v1,最大花費為v2
int main()
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
add_edge(0,n+m+1,n*m,0,0);
add_edge(n+m+2,0,n*m,0,0);
add_edge(n+m+1,n+m+3,n*m,0,0);
int fl,ans;
mcmf(n+m+2,n+m+3,n+m+4,fl,ans);
printf("%d\n",sum+ans);
} return 0;
}
acdream 1056 (黑白染色)
題意 給你一些關係,每個關係是兩隻馬的名字,表示這兩個馬不能在乙個分組裡,問你能否將這些馬分成兩組。黑白染色,相鄰的點染不同顏色。bfs搞即可,水題。this code is made by wangzhili problem 1056 verdict accepted submission dat...
acdream1084(數論入門)
description 寒假又快要到了,不過對於lzx來說,頭疼的事又來了,因為眾多的後宮都指望著能和lzx約會呢,lzx得安排好計畫才行。假設lzx的後宮團有n個人,寒假共有m天,而每天只能跟一位後宮mm約會,並且由於後宮數量太過龐大了,而寒假的天數太少,所以lzx在寒假裡不會與乙個mm約會一次以...
ACdream 1073 雷霆戰機
中文題,根據題意做就好,判斷條件比較多,改 bug 要很久而且容易糊。學長說中文題一定要做出來,結果是最後 ac 的,中文題真的沒比英文題好做,一把心酸淚。提供乙個樣例 input 59999 1 23 8 9998 1 1 23 8 output yes 0 include include inc...