zoukankan      html  css  js  c++  java
  • A

    题目链接:https://cn.vjudge.net/contest/68128#problem/A

    反思:注意拆点,否则的话节点就没用了,还有注意源点和汇点的赋值。

    AC代码:

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<iomanip>
    #include<stack>
    #include<queue>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    # define inf 0x3f3f3f3f
    # define maxn 100+10
    # define ll long long
    int p,n;
    int ori[maxn][maxn],nex[maxn][maxn];
    int pre[maxn],vis[maxn];
    int u[maxn],v[maxn],w[maxn];
    struct node
    {
        int cost;
        int in[maxn];
        int out[maxn];
    } a[maxn];
    void init()
    {
        memset(ori,0,sizeof(ori));
        memset(nex,0,sizeof(nex));
        a[1].cost=inf;
        for(int i=1; i<=p; i++)
        {
            a[1].in[i]=0;
            a[1].out[i]=0;
            a[n+2].in[i]=1;
            a[n+2].out[i]=1;
        }
        a[n+2].cost=inf;
    }
    bool judge(int t1,int t2)
    {
        for(int i=1; i<=p; i++)
        {
            if(a[t1].out[i]!=a[t2].in[i]&&a[t2].in[i]!=2)return false;//多也不行,少也不行。
        }
        return true;
    }
    bool bfs(int st,int ed)
    {
        queue<int>q;
        memset(vis,0,sizeof(vis));
        vis[st]=1;
        q.push(st);
        pre[st]=st;
        while(!q.empty())
        {
            int top=q.front();
            q.pop();
            for(int i=1; i<=2*n; i++)
            {
                if(vis[i]==0&&nex[top][i])
                {
                    vis[i]=1;
                    pre[i]=top;
                    if(i==ed)return true;
                    q.push(i);
                }
            }
        }
        return false;
    }
    int EK(int st,int ed)
    {
        int ans=0;
        while(bfs(st,ed))
        {
            int minn=inf ;
            for(int i=ed; i!=st; i=pre[i])
            {
                minn=min(minn,nex[pre[i]][i]);
            }
            for(int i=ed; i!=st; i=pre[i])
            {
                nex[pre[i]][i]-=minn;
                nex[i][pre[i]]+=minn;
            }
            ans+=minn;
        }
        return ans;
    }
    int main()
    {
        while(~scanf("%d%d",&p,&n))
        {
            init();
            for(int i=2; i<=n+1; i++)//从2开始是为了把1当做源点
            {
                scanf("%d",&a[i].cost);
                for(int j=1; j<=p; j++)
                {
                    scanf("%d",&a[i].in[j]);
                }
                for(int j=1; j<=p; j++)
                {
                    scanf("%d",&a[i].out[j]);
                }
            }
            n+=2;//和原来相比加入了源点和汇点
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    if(i==j)
                    {
                        ori[i][j+n]=nex[i][j+n]=a[i].cost;
                    }
                    else if(i!=j&&judge(i,j))
                    {
                        ori[i+n][j]=nex[i+n][j]=a[i].cost;
                    }
                }
            }
            int ans=EK(1,n*2);
            int num=0;
            for(int i=2; i<n; i++)
            {
                for(int j=2; j<n; j++)
                {
                    if(ori[i+n][j]>nex[i+n][j])//如果拆点后当前流的流量变小了,说明这条路上有流量。
                    {
                        u[++num]=i;
                        v[num]=j;
                        w[num]=ori[i+n][j]-nex[i+n][j];
                    }
                }
            }
            printf("%d %d
    ",ans,num);
            for(int i=1; i<=num; i++)
            {
                printf("%d %d %d
    ",u[i]-1,v[i]-1,w[i]);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    ASP.NET Core 中间件 中间件(Middleware)和过滤器(Filter)的区别
    ASP.NET Core 中间件详解及项目实战
    开源项目1:某大学校友管理系统
    web安全浅析
    p2p网贷平台设计简析
    一些常见的并且比较难解决的设计问题
    CentOS 新增swap交换空间
    策略模式
    Centos6.4 本地yum源配置
    Linux(CentOs6.4)安装Git
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262846.html
Copyright © 2011-2022 走看看