• 太空飞行计划问题


    最大权闭合子图问题
    ans=sum-maxflow
    套路题

    //Writer:jr HSZ;%%%WJMZBMR
    #include<set>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const int N= 205,inf=0x7f7f7f7f;
    int m,n,h[N],ecnt=1,head[N];
    struct Edge {
        int nxt,to,val;
    } e[N<<1+3];
    void add(int bg,int ed,int val) {
        e[++ecnt].nxt=head[bg];
        e[ecnt].to=ed;
        e[ecnt].val=val;
        head[bg]=ecnt;
    }
    bool bfs() {
        memset(h,-1,sizeof h);
        queue<int>q;
        q.push(0);
        h[0]=0;
        while(!q.empty()) {
            int u=q.front();
            q.pop();
            for(int i=head[u]; i; i=e[i].nxt) {
                int v=e[i].to;
                if(h[v]==-1&&e[i].val) {
                    h[v]=h[u]+1;
                    q.push(v);
                }
            }
        }
        return h[105]!=-1;
    }
    int dfs(int x,int f) {
        if(x==105)return f;
        int used=0,tp;
        for(int i=head[x]; i; i=e[i].nxt) {
            int v=e[i].to;
            if(h[v]-1==h[x]&&e[i].val) {
                tp=dfs(v,min(e[i].val,f-used));
                used+=tp;
                e[i].val-=tp;
                e[i^1].val+=tp;
                if(used==f)return f;
            }
        }
        if(used==0)h[x]=-1;
        return used;
    }
    int maxflow;
    void dinic() {
        maxflow=0;
        while(bfs()) {
            maxflow+=dfs(0,0x7f7f7f7f);
        }
    }
    bool vis[N];
    int a,b,c,ans;
    int main() {
        cin>>m>>n;
        for(int i=1; i<=m; i++) {
            scanf("%d",&a);
            add(0,i,a);
            add(i,0,0);
            ans+=a;
            char tools[10000];
            memset(tools,0,sizeof tools);
            cin.getline(tools,10000);
            int ulen=0,tool;
            while (sscanf(tools+ulen,"%d",&tool)==1) { //之前已经用scanf读完了赞助商同意支付该实验的费用
                //tool是该实验所需仪器的其中一个
                //这一行,你可以将读进来的编号进行储存、处理,如连边。
                add(i,tool+m,inf);
                add(tool+m,i,0);
                if (tool==0)
                    ulen++;
                else {
                    while (tool) {
                        tool/=10;
                        ulen++;
                    }
                }
                ulen++;
    
            }
    //		while(~scanf("%d",&b)) {
    //			add(i,b+m,inf);
    //			add(b+m,i,0);
    //		}
        }
        for(int i=1; i<=n; i++) {
            scanf("%d",&a);
            add(i+m,105,a);
            add(105,i+m,0);
        }
        dinic();
        for(int i=1;i<=m;i++){
            if(h[i]!=-1)cout<<i<<' ';
        }
        cout<<endl;
        for(int i=1;i<=n;i++){
            if(h[i+m]!=-1)cout<<i<<" ";
        }
        cout<<endl;
        cout<<ans-maxflow;
        return 0;
    }
    
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    python--触发器, 储存过程, 事务
    python--MySQL权限管理 数据备份还原
    python--MySQL多表查询
    python--MySQl单表查询
    python--MySQL数据库初识
    WPF学习(7)命令
    WPF学习(6)路由事件
    WPF学习(5)依赖属性
    WPF学习(4)逻辑树和可视树
    WPF学习(3)布局
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9266153.html
Copyright © 2020-2023  润新知