POJ 2396 Budget 有上下限的最大流

2021-09-07 23:09:37 字數 1344 閱讀 1988

題意:輸入的第一行是測試資料的個數。每組測試資料的第一行是n和m。第二行是n個數,表示n行的和,第三行是m個數,表示m列的和。接下來乙個k,表示有以下k個限制,每個限制的形式x y z w,其中z是< > 或者=,表示第x行第y列的元素和w的大小關係。假如z是》,那麼說明第x行第y列的元素必須大於w。如果x是0,意思指所有第y列的數和w的大小關係;如果y是0,意思指所有第x行的數和w的大小關係;如果x和y均為0,則表示整個矩陣和w的大小關係。如果有滿足所有條件的矩陣,輸出;沒有的話,輸出impossible。

思路:上下限最大流。

#include #include #include #define max 230

#define min(x,y) ((x)<(y)?(x):(y))

#define max(x,y) ((x)>(y)?(x):(y))

using namespace std;

const int inf=1000000000;

int high[max][max],low[max][max];

int cap[max][max];

int in[max],out[max],inc[max],pre[max],visit[max];

int n,m,s,t,ss,tt,sum;

int r[max],c[max];

void input()

else if(u!=0&&v==0)

else if(u==0&&v==0)

}else

}s=0;t=n+m+1;

for(i=1;i<=n;i++)low[s][i]=high[s][i]=r[i];

for(i=1;i<=m;i++)low[i+n][t]=high[i+n][t]=c[i];

}int bfs(int s,int t)

} return 0;

}int maxflow(int s,int t)

} return maxflow;

}int limitmaxflow()

for(ss=t+1,tt=t+2,i=0;i<=t;i++) cap[ss][i]=in[i],cap[i][tt]=out[i];

cap[t][s]=inf;

ans=maxflow(ss,tt);

if(ans!=sum) return 0;

cap[t][s]=cap[s][t]=0;

ans=maxflow(s,t);

return 1;

}int c;

int main()

int i,j;

for(i=1;i<=n;i++)

}return 0;

}

POJ2396 Budget 上下界網路流

表示弱看了半天才能勉強看懂啊。為什麼有上下界會流量不守恆,可以看這篇文章,裡面有證明。嗯。如果理解了原理的話,這題應該算是乙個入門題了吧。要注意的地方就是,因為給的條件有大於和小於,所以更新low和up的時候用cap 1,cap 1,而不是cap。調了好久才發現的。include include i...

poj2396 Budget 上下界可行流

budget 題意 給定乙個棋盤,給定每一行每一列的和,還有每個點的性質。求乙個合理的棋盤數值放置方式。思路 比較經典的網路流模型,把每一列看成乙個點,每一行看成乙個點,利用上下界可行流的思路建圖就行了,注意這裡由於是嚴格的小於和大於,所以可以利用 x 1,x 1。還有就是這道題的0 0 說的是對整...

POJ2396 Budget 有源匯上下界可行流

好久沒a的這麼舒暢了。第一次寫居然1a辣。part2 有源匯上下界可行流 有源匯上下界可行流就是在多了源點和匯點,這樣導致除了源點和匯點外的其他店都流量守恆,我們可以從 t 向 s連一條容量為無窮大的邊,保證s,t 也流量守恆,然後就可以轉化為無源匯上下界可行流做啦。這題的建圖很直觀,行列建圖,每行...