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


    #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
    ",-mcmf(s,t));
        }
        return 0;
    }
  • 相关阅读:
    网页简单模块布局
    Navicat 8 注册密码
    布局黄冈中学
    php导出csv格式文件
    518. 零钱兑换 II
    1813. 句子相似性 III
    ransac算法概述
    c++ 读取文件夹下所有的文件名
    c++ 获取系统时间 写txt string 转 char* 文件改名 文件删除
    1498. 满足条件的子序列数目 二分 快速幂 等比数列前n项和公式
  • 原文地址:https://www.cnblogs.com/wshh/p/4495413.html
Copyright © 2020-2023  润新知