码迷,mamicode.com
首页 > 其他好文 > 详细

UVALIVE 6905 Two Yachts(最小费用最大流)

时间:2015-05-11 21:21:58      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

#include <bits/stdc++.h>

using namespace std;
const int maxn=11111;
const int inf=0x3f3f3f3f;
int t,n;
int u[maxn],v[maxn],w[maxn],head[maxn<<1];
int x[maxn<<1],cnt,ecnt;
int d[maxn<<1],p[maxn<<1],inq[maxn<<1],a[maxn<<1];
struct Edge{
    int u,v,cost,cap,flow,p;
    Edge(){};
    Edge(int u,int v,int cost,int cap,int flow,int p):u(u),v(v),cost(cost),cap(cap),flow(flow),p(p){};
}e[maxn<<4];
void add(int u,int v,int c,int f){
    e[ecnt]=Edge(u,v,c,f,0,head[u]);
    head[u]=ecnt++;
}
bool spfa(int s,int t){
    memset(d,0x3f,sizeof d);
    memset(inq,0,sizeof inq);
    d[s]=0;inq[s]=1;a[s]=inf;
    queue<int>q;
    q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        inq[u]=0;
        for(int i=head[u];~i;i=e[i].p){
            int v=e[i].v;
            if(e[i].cap>e[i].flow&&d[v]>d[u]+e[i].cost){
                d[v]=d[u]+e[i].cost;
                p[v]=i;
                a[v]=min(a[u],e[i].cap-e[i].flow);
                if(!inq[v]){
                    q.push(v);
                    inq[v]=1;
                }
            }
        }
    }
    return d[t]!=inf;
}
int mcmf(int s,int t){
    int ans=0;
    while(spfa(s,t)){
        ans+=d[t];
        int u=t;
        while(u!=s){
            e[p[u]].flow+=a[t];
            e[p[u]^1].flow-=a[t];
            u=e[p[u]].u;
        }
    }
    return ans;
}
int main()
{
//    freopen("in","r",stdin);
    cin>>t;
    while(t--){
        scanf("%d",&n);
        memset(head,-1,sizeof head);
        cnt=0;
        for(int i=0;i<n;i++){
            scanf("%d%d%d",u+i,v+i,w+i);
            x[cnt++]=u[i];
            x[cnt++]=++v[i];
        }
        sort(x,x+cnt);
        cnt=unique(x,x+cnt)-x;
        for(int i=0;i<n;i++){
            u[i]=lower_bound(x,x+cnt,u[i])-x+1;
            v[i]=lower_bound(x,x+cnt,v[i])-x+1;
        }
        int s=0,t=cnt+1;
        for(int i=0;i<t;i++){
            add(i,i+1,0,2);
            add(i+1,i,0,0);
        }
        for(int i=0;i<n;i++){
            add(u[i],v[i],-w[i],1);
            add(v[i],u[i],-w[i],-1);
        }
        printf("%d\n",-mcmf(s,t));
    }
    return 0;
}

 

UVALIVE 6905 Two Yachts(最小费用最大流)

标签:

原文地址:http://www.cnblogs.com/wshh/p/4495413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!