經典的最大流題
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 ...