POJ 1273

  最大流的入门题,完全不需要建模,直接把1作为源点,m作为汇点用EK算法跑一遍即可。

  这次第一次用C++写,EK使用的是网上找的模版,思想也许没有完全理解,待理解之后再写一篇EK的学习笔记吧,先暂时用着模版。

#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;

const int MAX_DIT_NUM = 210 , MAX_INTERSECTION_NUM = 210 , INF = 0x7fffffff;

int cap[ MAX_DIT_NUM ][ MAX_DIT_NUM ] , restFlow[ MAX_DIT_NUM ] , pre[ MAX_DIT_NUM ];
queue<int> que;

int bfs( int src , int dest )
{
    while( !que.empty() )
    {
        que.pop();
    }

    for( int i = -1 ; i < MAX_INTERSECTION_NUM ; i++)
    {
        pre[ i ] = -1;
    }
    pre[ src ] = 0;
    restFlow[ src ] = INF;
    que.push( src );

    while( !que.empty() )
    {
        int now = que.front();
        que.pop();
        if( now == dest )
        {
            break;
        }
        for( int i = 1 ; i <= dest ; i++ )
        {
            if( i != src && cap[ now ][ i ] > 0 && pre[ i ] == -1 )
            {
                pre[ i ] = now;
                restFlow[ i ] = min( cap[ now ][ i ] , restFlow[ now ] );
                que.push( i );
            }
        }
    }
    if( pre[ dest ] == -1 )
    {
        return -1;
    }
    else
    {
        return restFlow[ dest ];
    }
}


int getMaxFlow( int src, int dest )
{
    int sumFlow = 0 , incrs = bfs( src , dest);
    while( incrs != -1 )
    {
        int now = dest;
        while( now != src )
        {
            int last = pre[ now ];
            cap[ last ][ now ] -= incrs;
            cap[ now ][ last ] += incrs;
            now = last;
        }
        sumFlow += incrs;
        incrs = bfs( src , dest );
    }
    return sumFlow;
}


int main()
{
    int ditNum ,intrscNum;
    while( scanf("%d%d", &ditNum , &intrscNum) != EOF )
    {
        memset( cap , 0 , sizeof(cap) );
        memset( restFlow , 0 ,sizeof(restFlow));
        for( int i = 0 ; i < ditNum ; i++)
        {
            int stt,end,flow;
            scanf("%d%d%d", &stt , &end , &flow );
            if( stt != end )
            {
                cap[ stt ][ end ] += flow;
            }

        }
        printf("%d\n", getMaxFlow( 1 , intrscNum ));
    }
    return 0;
}

 

posted @ 2013-03-23 16:41  等待电子的砹  阅读(267)  评论(0编辑  收藏  举报