經典的最大流題POJ1273

2021-06-07 21:19:43 字數 2959 閱讀 9460

經典的最大流題

poj1273

——其他練習題 poj3436 

、現在有m

個池塘(從1

到m開始編號

,1為源點

,m為匯點),及

n條水渠

,給出這

n條水渠所連線的池塘和所能流過的水量

,求水渠中所能流過的水的最大容量

.一道基礎的最大流題目。

輸入:5 4

1 2 40

1 4 20

2 4 20

2 3 30

3 4 10

輸出:

//poj1273_ek.cpp

#include#includeusing namespace std;

const int n=201;

const int inf=99999999;

int n,m,sum,s,t;//s,t為始點和終點

int flow[n][n],cap[n][n],a[n],p[n];

//分別為:flow[u][v]為流量、cap[u][v]為容量、a[i]表示源點s到節點i的路徑上的最小殘留量、p[i]記錄i的前驅

int min(int a,int b)

void edmonds_karp()

void edmonds_karp()}}

if(a[m]==0)//找不到增廣路,則當前流已經是最大流

break;

sum+=a[m];//流加上

for(i=m;i!=s;i=p[i])// //從匯點順著這條增廣路往回走

}printf("%d\n",sum);

}int main()

edmonds_karp();

}return 0;

}

#include #include #include #include #define min(x,y) ((x0) 

} if (dis[n]>0)

return 1;

else

return 0;//匯點的dis小於零,表明bfs不到匯點

} //find代表一次增廣,函式返回本次增廣的流量,返回0表示無法增廣

int find(int x,int low)//low是源點到現在最窄的(剩餘流量最小)的邊的剩餘流量

return 0;

} int main()

// ans=0;

while (bfs())//要不停地建立分層圖,如果bfs不到匯點才結束

printf("%d\n",ans);

} //system("pause");

}

//#define local

#include #include #include using namespace std;

#define maxn 210

#define inf 0x3f3f3f3f

struct edge

edge[maxn << 1];

int n, m;

int s, t;

int ans;

int e = 0;

int head[maxn];

int d[maxn];

int min(int a, int b)

void init()

}int bfs()

}} if(d[t] < 0)

return 0;

return 1;

}int dinic(int x, int flow)

} return 0;

}void solve()

printf("%d\n", ans); }}

int main()

/* 

編者感悟:

sap學了很長時間,一直不敢下手寫,結果就是不寫永遠不會真正的理解演算法的含義,sap理論很多演算法書上都有講解,但我還是建議看數學專業 圖論的書,比如 《有向圖的理論,演算法及應用》,這本書的內容非常棒,相信看過的都知道吧,比其他演算法書上講的透多了。

sap有個優化就是 當出現斷鏈時,就可以直接退出,還有個優化是當前弧的優化,這兩個優化只需要一句話+乙個陣列就解決了,相當實惠,好的isap執行的效率真的非常高,我寫的isap用的是鏈式前向星法表示。

這個就算是模板了吧,雖然寫的不是很好。。 */

#include#include#include#includeusing namespace std;

#define maxn 500

#define maxe 40000

#define inf 0x7fffffff

long ne,nv,tmp,s,t,index;

struct edgeedge[maxe];

long net[maxn];

long isap()

}for(i = s; i != t; i = edge[curedge[i]].v)

max_flow += cur_flow;

u = neck;

}/* if .... else ... */

for(i = curedge[u]; i != -1; i = edge[i].next)

if(edge[i].cap > 0 && dist[u] == dist[edge[i].v]+1)

break;

if(i != -1)

else{

if(0 == --numb[dist[u]]) break;

curedge[u] = net[u];

for(tmp = nv,i = net[u]; i != -1; i = edge[i].next)

if(edge[i].cap > 0)

tmp = tmp

POJ 1273 最大流裸題。

用ek演算法水過 include include include include include include include include include includeusing namespace std include const int n 205 const int inf 2147...

POJ 1273 樸素的最大流

poj 1273 ditch mike w 2011 10 5 今天我才發現,我對殘餘網路理解有誤!include include include include ifndef true define true 1 endif define size 222 define qsize 2 size ...

poj 1273 最大流 EK演算法

最大流問題 從源點到終點運送貨物,經過一些中轉站,中轉站之間有路徑連線,每條路徑有運送貨物量的上限,求最多能運送多少貨物 找最大流就是每次找增廣路徑,並更新網路,直到找不到增廣路徑 includeusing namespace std const int max 201 const int inf ...