随笔-141  评论-9  文章-3  trackbacks-0
标准的最大流. 注意有重边. 重复边直接累加.

/*
ID: lorelei3
TASK: ditch
LANG: C++
*/


#include 
<fstream>
#include 
<queue>
#include 
<memory.h>

using namespace std;

const int INF = 0x7FFFFFF;
const int MAXN = 205;

int s,t,n;

long long c[MAXN][MAXN], pre[MAXN], delta[MAXN];

bool bfs(int s, int t){
    
int i;
    queue
<int> Q;
    memset(pre, 
0sizeof(pre));
    memset(delta, 
0sizeof(delta));

    delta[s] 
= INF;
    Q.push(s);

    
while(!Q.empty()){
        
int cur = Q.front();
        Q.pop();

        
for(i=1; i<=n; ++i){
            
if(delta[i]==0 && c[cur][i]>0){
                delta[i] 
= delta[cur]<c[cur][i] ? delta[cur] : c[cur][i];
                pre[i] 
= cur;
                Q.push(i);
            }

        }

    }


    
if(delta[t]==0)
        
return false;

    
return true;
}


int edmonds_karp(int s, int t){
    
int i, ans=0;
    
while(bfs(s,t)){
        
for(i=t; i!=s; i=pre[i]){
            c[pre[i]][i] 
-= delta[t];
            c[i][pre[i]] 
+= delta[t];
        }

        ans 
+= delta[t];
    }

    
return ans;
}


int main(){

    
int k,i,j,v;

    ifstream fin(
"ditch.in");
    ofstream fout(
"ditch.out");

    fin
>>k>>n;

    s
=1; t=n;

    
while(k--){
        fin
>>i>>j>>v;
        c[i][j]
+=v;
    }


    fout
<<edmonds_karp(s,t)<<endl;

    
return 0;
}
posted on 2011-01-24 22:42 小阮 阅读(210) 评论(0)  编辑 收藏 引用 所属分类: USACO

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理