ACdream1171 下界轉上界 最大費用可行流

2021-06-24 11:56:50 字數 1374 閱讀 3331

每一行/列至少取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...