标准的最大流. 注意有重边. 重复边直接累加.

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

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

 using namespace std;
using namespace std;

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

 int s,t,n;
int s,t,n;

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


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

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


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


 for(i=1; i<=n; ++i)
        for(i=1; i<=n; ++i) {
{

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

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

 return true;
    return true;
 }
}


 int edmonds_karp(int s, int t)
int edmonds_karp(int s, int t) {
{
 int i, ans=0;
    int i, ans=0;

 while(bfs(s,t))
    while(bfs(s,t)) {
{

 for(i=t; i!=s; i=pre[i])
        for(i=t; i!=s; i=pre[i]) {
{
 c[pre[i]][i] -= delta[t];
            c[pre[i]][i] -= delta[t];
 c[i][pre[i]] += delta[t];
            c[i][pre[i]] += delta[t];
 }
        }
 ans += delta[t];
        ans += delta[t];
 }
    }
 return ans;
    return ans;
 }
}


 int main()
int main() {
{

 int k,i,j,v;
    int k,i,j,v;

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

 fin>>k>>n;
    fin>>k>>n;

 s=1; t=n;
    s=1; t=n;


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

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

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