POJ2175 最小費用流消圈演算法

2021-06-08 19:38:18 字數 1028 閱讀 1787

#include #include #include #include #include using namespace std;

const int nn=210;

const int mm=100000;

const int inf=0x3fffffff;

inline int abs(int x)

int n,m,s,t,nv,en,head[nn];

struct edge

e[mm];

inline void add(int u,int v,int c,int f1,int f2)

//這題的很多版本的流量都是用的鄰接矩陣,我寫慣了鄰接表,強迫症下不喜歡矩陣了~

int dis[nn],cou[nn],p[nn];

bool vis[nn];

int circle_spfa()

if (++cou[v]>=nv) return v;}}

}return -1;

}int ans[nn][nn];

void solve()

puts("suboptimal"); //單詞拼錯,貢獻wa n次

memset(vis,0,sizeof(vis));

while (!vis[x])

//spfa退出的點未必是負圈中的點

v=x; do

while (v!=x);//消圈

memset(ans,0,sizeof(ans));

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

}int x[nn],y[nn],z[nn],s1[nn],s2[nn];

int main()

}for (i=1; i<=n; i++) add(s,i,0,z[i]-s1[i],s1[i]);

for (i=1; i<=m; i++) add(i+n,t,0,z[i+n]-s2[i],s2[i]);

solve();

}return 0;

}

poj 2175 費用流 消圈

這道題如果直接費用流會超時。題目只是讓我們判斷是否是最好的情況,我們只需要找到更好的一種情況即可,不需要求最好的。也就是說按照最小費用流的做法,我們只需要在殘餘網路還能找到乙個負圈的即可。這是充分必要條件,如果達到最優解,就沒有負圈了。所以我們按照題意建立圖還有殘餘網路。之後判斷圖中是否存在乙個負圈...

poj 2175 最小費用最大流TLE

題意 一條街上有n個大樓,座標為xi,yi,bi個人在裡面工作。然後防空洞的座標為pj,qj,可以容納cj個人。從大樓i中的人到防空洞j去避難所需的時間為 abs xi pi yi qi 1。現在設計了乙個避難計畫,指定從大樓i到防空洞j避難的人數 eij。判斷如果按照原計畫進行,所有人避難所用的時...

poj 2175 費用流判負環 消環

題意 給出n棟房子位置和每棟房子裡面的人數,m個避難所位置和每個避難所可容納人數。然後給出乙個方案,判斷該方案是否最優,如果不是求出乙個更優的方案。思路 很容易想到用最小費用流求出最優時間,在與原方案花費時間對比判斷原方案是否最優。但是這種方法會超時的。放棄該思路。看看題目沒要求要最優解,而是得到乙...