poj 1273 Drainage Ditches

    技术2024-10-14  52

     

    最大流第一题,水题。

     

    大概意思就是求从源点到汇点的最大流啦。

     

    WA了数次,看讨论,发现可能有重边 = =。。。边上的流量要加起来,好阴险啊。。。

     

    白皮书上的模板~EK算法,增广路~看懂了,嘻嘻。自己能写下来了,很好呀~哇咔咔。。

     

    #include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> #define MAX 250 using namespace std; int cap[MAX][MAX]; int m; int EKarp(int s,int t) { queue<int> Q; int flow[MAX][MAX],a[MAX],u,v,f,pre[MAX]; f = 0; memset(flow,0,sizeof(flow)); while(1) { Q.push(s); memset(a,0,sizeof(a)); a[s] = INT_MAX; while( !Q.empty() ) { u = Q.front(); Q.pop(); for(v=1; v<=m; v++) if( !a[v] && cap[u][v] > flow[u][v] ) { Q.push(v); a[v] = a[u] < cap[u][v] - flow[u][v] ? a[u] : cap[u][v] - flow[u][v]; pre[v] = u; } } if( a[t] == 0 ) break; for(u=t; u!=s; u=pre[u]) { flow[pre[u]][u] += a[t]; flow[u][pre[u]] -= a[t]; } f += a[t]; } return f; } int main() { int from,to,c,n,ans; while( scanf("%d%d",&n,&m) != EOF ) { memset(cap,0,sizeof(cap)); while( n-- ) { scanf("%d%d%d",&from,&to,&c); cap[from][to] += c; } ans = EKarp(1,m); printf("%d/n",ans); } return 0; }  

    最新回复(0)