• [网络流24题]太空飞行计划问题


    Description

    $W$教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业 性实验而获取利润。现已确定了一个可供选择的实验集合$E={E_1,E_2,...,E_m}$,和进行这些实验需要使用的全部仪器的集合$I={I_1,I_2,...,I_n}$。实验$E_j$需要用到的仪器是$I$的子集$R_j;in;I$。配置仪器$I_k$的费用为$c_k$美元。实验$E_j$的赞助商已同意为该实验结果支付$p_j$美元。$W$教授的任务是确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

    Input

    文件第$1$行有$2$个正整数$m,n$。$m$是实验数,$n$是仪器数。

    接下来的$m$行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。

    最后一行的$n$个数是配置每个仪器的费用。

    Output

    第$1$行是实验编号.

    第$2$行是仪器编号.

    最后一行是净收益。

    Sample Input

    2 3
    10 1 2
    25 2 3
    5 6 7

    Sample Output

    1 2
    1 2 3
    17

    HINT

    $n,m,p_i<50$.

    Solution

    最大权闭合子图.

    $s$向实验i连一条容量为$p_i$的有向边,

    实验$i$向仪器$j$连一条容量为$+infty$的有向边,

    仪器$i$向$t$连一条容量为$c_i$的有向边,

    最大收益=$sum_{i=1}^{m}p_i$-最小割.

    #include<cmath>
    #include<ctime>
    #include<queue>
    #include<stack>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define N 105
    #define M 5205
    #define INF 500
    using namespace std;
    struct graph{
        int nxt,to,f;
    }e[M];
    int g[N],c[N],p[N],dep[N],n,m,s,t,sum,cnt=1;
    bool b[N];
    queue<int> q; 
    inline bool read(int &k){
        int ret=0;char c=getchar();
        while(!isdigit(c))
            c=getchar();
        while(isdigit(c)){
            ret=(ret<<1)+(ret<<3)+c-'0';
            c=getchar();
        }
        k=ret;
        return c!='
    ';
    }
    inline void addedge(int x,int y,int f){
        e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;e[cnt].f=f;
    } 
    inline void adde(int x,int y,int f){
        addedge(x,y,f);addedge(y,x,0);
    }
    inline bool bfs(int u){
        memset(dep,0,sizeof(dep));
        dep[u]=1;q.push(u);
        while(!q.empty()){
            u=q.front();q.pop();
            for(int i=g[u];i;i=e[i].nxt)
                if(e[i].f>0&&!dep[e[i].to]){
                    q.push(e[i].to);
                    dep[e[i].to]=dep[u]+1;
                }
        }
        return dep[t];
    }
    inline int dfs(int u,int f){
        int ret=0;
        if(u==t) return f;
        for(int i=g[u],d;i&&f;i=e[i].nxt)
            if(e[i].f>0&&dep[e[i].to]>dep[u]){
                d=dfs(e[i].to,min(f,e[i].f));
                e[i].f-=d;e[i^1].f+=d;ret+=d;f-=d;
            }
        return ret;
    }
    inline int dinic(){
        int ret=0;
        while(true){
            if(!bfs(s)) return ret;
            ret+=dfs(s,INF);
        }
    }
    inline void Aireen(){
        scanf("%d%d",&m,&n);
        s=m+n+1;t=s+1;
        for(int i=1,k;i<=m;++i){
            if(!read(p[i])) break;
            while(read(k)) adde(i,k+m,INF);
            adde(i,k+m,INF);
        }
        for(int i=1;i<=n;++i){
            scanf("%d",&c[i]);adde(i+m,t,c[i]);
        }
        for(int i=1;i<=m;++i){
            sum+=p[i];adde(s,i,p[i]);
        }
        sum-=dinic();
        for(int i=1;i<=m;++i)
            if(!bfs(i)){
                printf("%d ",i);
                for(int j=g[i];j;j=e[j].nxt)
                    b[e[j].to-m]=true;
            }
        printf("
    ");
        for(int i=1;i<=n;++i)
            if(b[i]) printf("%d ",i);
        printf("
    ");
        printf("%d
    ",sum);
        return;
    }
    int main(){
        freopen("shut.in","r",stdin);
        freopen("shut.out","w",stdout);
        Aireen();
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    [转]myeclipse 生成JAR包并引入第三方包
    Composer 基本指令操作使用
    Laravel Eloquent ORM
    [转]Spring Boot——2分钟构建spring web mvc REST风格HelloWorld
    C# IoC 容器
    【转载】laravel的MVC
    [转]Laravel 4之Eloquent ORM
    [转]Laravel 4之数据库操作
    svn unable to connect to a repository at url 执行上下文错误 不能访问SVN服务器问题
    Make a travel blog by Blogabond the theme of wordpress
  • 原文地址:https://www.cnblogs.com/AireenYe/p/6240643.html
Copyright © 2020-2023  润新知