FZU2295 Human life:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛

目录

  • Catalog
  • Solution:

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:Portal传送门

?原题目描述在最下面。
?题意就是很裸的最大权闭合子图。
?推荐阅读:胡伯涛《最小割模型在信息学竞赛中的应用》
?完完全全的模板题:新疆大学五月月赛-D-勤奋的杨老师
?本题题意:m(50)个任务,n个技能。完成每个任务由相应的收益,完成每个任务前必须学一些技能。有些技能由先修技能。
?有些任务不能同时完成。

Solution:

?训练赛的时候听队友讲完题意,一眼就直接建对图了,但是没敢敲,因为比赛刚开始,想先写签到题。
?详细de题解啊啊啊
?直接讲建图:源点S想每个任务连边,流量为其收益,每个任务向其需要的技能连边,每个任务向先修技能连边,每个技能向汇点T连边,流量为其花费。答案是\(sum_{任务}-maxflow\).
?难点在于有些任务不能同时完成。因为只有k(5)对,直接二进制枚举所有对互斥情况。为1则不能选第一个任务,为0则不能选第二个任务。不选就是取反再异或一下。
?细节看代码吧。

AC_Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;

const int MXN = 2e2+7;
const int MXE = MXN*MXN;
struct DINIC{
  int tot,vt,vs;
  int d[MXN],head[MXN];
  struct lp{
    int v,w,nex;
  }cw[MXE];
  void add_edge(int a,int b,int c){
    cw[++tot].v=b;cw[tot].nex=head[a],cw[tot].w=c;
    head[a]=tot;
    cw[++tot].v=a;cw[tot].nex=head[b],cw[tot].w=0;
    head[b]=tot;
  }
  bool bfs(){
    memset(d,-1,sizeof(d));
    queue<int>Q;
    Q.push(vt);d[vt]=0;
    while(!Q.empty()){
      int u=Q.front();
      Q.pop();
      for(int i=head[u];i!=-1;i=cw[i].nex){
        int v=cw[i].v;
        if(cw[i^1].w&&d[v]==-1){
          d[v]=d[u]+1;
          Q.push(v);
        }
      }
    }
    return d[vs]!=-1;
  }
  int dfs(int x,int f){
    if(x==vt||f==0) return f;
    int use=0,w;
    for(int i=head[x];i!=-1;i=cw[i].nex){
      int to=cw[i].v;
      if(d[to]==d[x]-1 && cw[i].w){
        w=dfs(to,min(cw[i].w,f-use));
        cw[i].w-=w,cw[i^1].w+=w;
        use+=w;
        if(use==f) return f;
      }
    }
    return use;
  }
  void init(int st,int ed){
    tot = -1;
    memset(head,-1,sizeof(head));
    vs = st; vt = ed;
  }
  int max_flow(){
    int ans=0;
    while(bfs())ans+=dfs(vs,INF);
    return ans;
  }
}dinic;
const int N = 105;
int n, m, k;
int vs, vt;
struct lp{
  int v,x;
  int a[N];
}ar[N],br[N];
int c[N],d[N];
int main(){
  int tim;
  scanf("%d", &tim);
  while(tim--){
    scanf("%d%d%d", &n, &m, &k);
    vs = 0;vt = m+n+1;
    for(int i = 1; i <= n; ++i){
      int v,x;
      scanf("%d%d", &v, &x);
      ar[i].v=v;ar[i].x=x;
      for(int j = 0; j < x; ++j){
        scanf("%d", &ar[i].a[j]);
      }
    }
    for(int i = 1; i <= m; ++i){
      int v,x;
      scanf("%d%d", &v, &x);
      br[i].v=v;br[i].x=x;
      for(int j = 0; j < x; ++j){
        scanf("%d", &br[i].a[j]);
      }
    }
    for(int i = 0; i < k; ++i){
      scanf("%d%d", &c[i], &d[i]);
      --c[i];--d[i];
    }
    int sta = 1 << k, ans = 0;
    //printf("%lld\n", 1<<50);
    for(int t = 0; t < sta; ++t){
      LL hhh = (1LL<<m)-1;
      for(int i = 0; i < k; ++i){
        LL x = 1LL<<c[i], y = 1LL<<d[i];
        if(t&(1<<i)){
          hhh &= (~x);
        }else{
          hhh &= (~y);
        }
      }
      //printf("hhh = %d\n", hhh);
      dinic.init(vs, vt);
      for(int i = 1, v; i <= n; ++i){
        dinic.add_edge(i+m,vt,ar[i].v);
        for(int j = 0; j < ar[i].x; ++j){
          v = ar[i].a[j];
          dinic.add_edge(i+m,v+m,INF);
        }
      }
      int sum = 0, tmp;
      for(int i = 1, v; i <= m; ++i){
        if((hhh&(1LL<<(i-1)))==0)continue;
        dinic.add_edge(vs,i,br[i].v);
        sum += br[i].v;
        for(int j = 0; j < br[i].x; ++j){
          v = br[i].a[j];
          dinic.add_edge(i,v+m,INF);
        }
      }
      tmp = dinic.max_flow();
      ans = max(ans, sum - tmp);
    }
    printf("%d\n", ans);
  }
  return 0;
}

Problem Description:

原文地址:https://www.cnblogs.com/Cwolf9/p/9539241.html

时间: 2024-10-06 20:00:25

FZU2295 Human life:网络流-最大权闭合子图-二进制优化-第九届福建省大学生程序设计竞赛的相关文章

【暖*墟】#网络流# 最大权闭合子图

[相关概念详解] 闭合图:有向图的一个点集,且这个点集的所有出边仍然指向该点集. 最大权闭合图:(每一个点有一个权值)在所有的合法闭合图中,点权之和最大的图. 处理问题:权值有正有负,重复选只算一次,选择有相互关联性 的问题. 首先有一个有向连通图(闭合图),每个点带有一个权值,例如: 造出一个超级源点S和一个超级汇点T,把S连边到所有带有正权的点上,每条边的容量是这个点的权: 把所有带负权的点连边到T,每条边的容量是这个点的权的相反数(正值).原来的边的容量设成无限大. 所有的点按权值的正负连

BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当年给别人写的情书一样长-- 最大权闭合子图 最大权闭合子图问题:一个有向图中,每个点带有一个权值(有正有负),有向边\(u \to v\)表示选\(u\)必须选\(v\),选出一些点使权值和最大,问权值和最大是多少. 最大权闭合子图的解法:网络流建图,对于每个点\(u\),设权值为\(w_u\),如

FZU - 2295 Human life (最大权闭合子图)

题目链接 FZU - 2295 Human life 题目分析 题意:你在玩一个游戏,在其中你可以通过学习一些技能,但是学习某些技能之前,可能还要学习一些其他的技能,并且学习任何技能都有一定的花费: 而我们可以通过掌握某些工作以获取报酬,为了掌握这一工作,我们必须学会特定的技能. 不过有些工作彼此之间是冲突的,简单来说:如果你掌握了工作A,那么将无法掌握工作B 思路: 由于技能之间也存在依赖关系,但实际上如果要获取某一工作的报酬,那么必须选择这个工作的前置技能以及前置技能的前置技能, 那么显然,

hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)

#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people could not tolerate the pollution in the city any more, and started a long-lasting protest. Eventually, the municipal government made up its mind to deal w

hiho一下 第119周 #1398 : 网络流五&#183;最大权闭合子图 【最小割-最大流--Ford-Fulkerson 与 Dinic 算法】

#1398 : 网络流五·最大权闭合子图 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1..M),邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值. 每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行. 班级建设的活

[网络流24题] 太空飞行计划 (最大权闭合子图---网络最大流)

727. [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={ I1, I2,…,In }.实验Ej 需要用到的仪器是I的子集Rj∈I.配置仪器Ik 的费用为ck 美元.实验Ej

网络流——最小割求最大权闭合子图

定义 有一个有向图,每一个点都有一个权值(可以为正或负或0),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图. 如下图:  能选的子图有?,{4},{3,4},{2,4},{1,2,3,4},它们的权值分别为0,-1,5,-6,4. 所以最大权闭合子图为{3,4},权值为5. 解法 这个问题可以转化为最小割问题,用网络流解决. 从源点s向每个正权点连一条容量为权值的边,每个负权点向汇点t连一条容量为权值的绝对值的边,有向图原来的边容量全部为无限大.  求它的最

[HihoCoder1398]网络流五&#183;最大权闭合子图

题目大意:有$N$项活动$M$个人,每个活动$act_i$有一个正的权值$a_i$,每个人$stu_i$有一个负的权值$b_i$.每项活动能够被完成当且仅当该项活动所需的所有人到场.如何选择活动使最终权值总和最大?即对于给定的有向无环图,求出最大权闭合子图的权值. 结论:最大权闭合子图的权值等于所有正权点之和减去最小割. 思路:引理:1.最小割一定是简单割:2.简单割一定和一个闭合子图对应.即最小割一定对应一个闭合子图,且就是最大权闭合子图.证明(摘自HihoCoder):首先有割的容量C(S,

hdu-5855 Less Time, More profit(最大权闭合子图)

题目链接: Less Time, More profit Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Problem Description The city planners plan to build N plants in the city which has M shops. Each shop needs products from some plants to