Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:这题有点阴险,可能出现两条相同边!

Posted by lyzardiar at 2011-03-14 12:11:38 on Problem 1273 and last updated at 2011-03-14 12:30:19
In Reply To:Re:这题有点阴险,可能出现两条相同边! Posted by:lyzardiar at 2011-03-14 12:10:29
郁闷了..... 邻接表写的 代码, 重边处理也太....... 空间换时间了,  结果还是
错...... 郁闷.      换成矩阵居然就A 了
代码:

/*
ID: baiyun2
PROG: Drainage Ditches
LANG: C++
Mail to   : miyubai@gamil.com
My Blog   : www.baiyun.me
Author By : MiYu
Test      : 1
Complier  : g++ mingw32-3.4.2
Program   : POJ_1273
Doc Name  : Drainage Ditches
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <utility>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
void Debug () {
    #ifdef LOCAL
    freopen ( "1.in", "r", stdin );
    freopen ( "1.out", "w", stdout );
    #endif
}
struct P {
       int pos, val;
       P ( int a = 0, int b = 0 ) : pos(a),val(b) {}      
};
const int inf = 0x7fffffff;
int N, M, x, y, val;
int v[222], pre[222], flow[222][222], mp[222][222];
vector < P > vec[222];
int BFS () {
    queue < int > q;
    q.push ( 1 );
    memset ( v, 0, sizeof ( v ) );
    v[1] = inf;   
    while ( !q.empty () ) {
          int t = q.front ();  q.pop ();
          /*
          for ( int i = 0; i < vec[t].size (); ++ i ) {
              P &e = vec[t][i];
              if ( !v[e.pos] && e.val > flow[t][e.pos] ) {
                  v[e.pos] = min ( v[t], e.val - flow[t][e.pos] );
                  pre[e.pos] = t;  q.push ( e.pos );     
              }    
          }   
          */
          for ( int i = 1; i <= N; ++ i ) {
              if ( !v[i] && mp[t][i] > flow[t][i] ) {
                 v[i] = min ( v[t], mp[t][i] - flow[t][i] );
                 pre[i] = t;  q.push ( i );     
              }    
          }   
    } 
    return v[N];
}
int EK ( int res = 0 ) {
    memset ( flow, 0, sizeof ( flow ) );
    while ( true ) {
          if ( val = BFS () ) {
              for ( int i = N; i != 1; i = pre[i] ) {
                  flow[i][pre[i]] -= val;
                  flow[pre[i]][i] += val;    
              }  
              res += val;  
          } else break;     
    }    
    return res;
}
int main ()
{
    Debug ();
    while ( scanf ( "%d%d", &M, &N ) != EOF ) {
          memset ( mp, 0, sizeof ( mp ) );
          //for ( int i = 1; i <= N; ++ i ) vec[i].clear ();
          for ( int i = 1; i <= M; ++ i ) {
              scanf ( "%d%d%d", &x, &y, &val ); 
              mp[x][y] += val;
              //vec[x].push_back ( P ( y, mp[x][y] ) );  
          }
          printf ( "%d\n", EK () );
    }

    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator