`

UVa10779 Collector's Problem 最大流(求种类最多)

 
阅读更多

 

//题目给出T,表示测试组数,n和m表示一共n和人,和m中贴纸。
//接下来n行,第一个是k,表示这个人的贴画种数,接下来有k
//个数,表示不同种贴画的个数,求第一个人经过交换贴画,最多
//可以有多少种贴画,交换规则,一对一,对方没有这张才可以交换。
//分析:
//第一个人当源点,得到的当汇点,每种贴画看做一个点,源点到这些点
//的容量为对应贴画的数量,每个人也看做一个点,弧上的容量为
//可以交换的张数,最后每个贴画到汇点
//的容量为1,求最大流,就是要求的结果。
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 100 + 10;
const int INF = 1000000000;

struct Edge {
  int from, to, cap, flow;
};

bool operator < (const Edge& a, const Edge& b) {
  return a.from < b.from || (a.from == b.from && a.to < b.to);
}

struct Dinic {
  int n, m, s, t;
  vector<Edge> edges;    // 边数的两倍
  vector<int> G[maxn];   // 邻接表,G[i][j]表示结点i的第j条边在e数组中的序号
  bool vis[maxn];        // BFS使用
  int d[maxn];           // 从起点到i的距离
  int cur[maxn];         // 当前弧指针

  void ClearAll(int n) {
    for(int i = 0; i < n; i++) G[i].clear();
    edges.clear();
  }

  void ClearFlow() {
    for(int i = 0; i < edges.size(); i++) edges[i].flow = 0;    
  }

  void AddEdge(int from, int to, int cap) {
    edges.push_back((Edge){from, to, cap, 0});
    edges.push_back((Edge){to, from, 0, 0});
    m = edges.size();
    G[from].push_back(m-2);
    G[to].push_back(m-1);
  }

  bool BFS() {
    memset(vis, 0, sizeof(vis));
    queue<int> Q;
    Q.push(s);
    vis[s] = 1;
    d[s] = 0;
    while(!Q.empty()) {
      int x = Q.front(); Q.pop();
      for(int i = 0; i < G[x].size(); i++) {
        Edge& e = edges[G[x][i]];
        if(!vis[e.to] && e.cap > e.flow) {
          vis[e.to] = 1;
          d[e.to] = d[x] + 1;
          Q.push(e.to);
        }
      }
    }
    return vis[t];
  }

  int DFS(int x, int a) {
    if(x == t || a == 0) return a;
    int flow = 0, f;
    for(int& i = cur[x]; i < G[x].size(); i++) {
      Edge& e = edges[G[x][i]];
      if(d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap-e.flow))) > 0) {
        e.flow += f;
        edges[G[x][i]^1].flow -= f;
        flow += f;
        a -= f;
        if(a == 0) break;
      }
    }
    return flow;
  }

  int Maxflow(int s, int t) {
    this->s = s; this->t = t;
    int flow = 0;
    while(BFS()) {
      memset(cur, 0, sizeof(cur));
      flow += DFS(s, INF);
    }
    return flow;
  }
};

Dinic g;

int main() {
  int T, n, m;
  scanf("%d", &T);
  for(int kase = 1; kase <= T; kase++) {
    scanf("%d%d", &n, &m);
    g.ClearAll(n+m+1); // s=0, 物品为结点1~m, 除Bob外的人为结点m+1~m+n-1,t=m+n
    for(int i = 0; i < n; i++) {
      int k, kind;
      scanf("%d", &k);
      vector<int> cnt(m+1, 0);
      for(int j = 0; j < k; j++) { scanf("%d", &kind); cnt[kind]++; }
      if(i == 0) { // Bob
        for(int j = 1; j <= m; j++)
          if(cnt[j] >= 1) g.AddEdge(0, j, cnt[j]); // s连边到物品
      } else { // 其他人
        for(int j = 1; j <= m; j++) {
          if(cnt[j] >= 2) g.AddEdge(m+i, j, cnt[j]-1); // 此人可以给出cnt[j]-1个物品j
          else if(cnt[j] == 0) g.AddEdge(j, m+i, 1); // 此人可以接受1个物品j
        }
      }
    }
    for(int i = 1; i <= m; i++) g.AddEdge(i, m+n, 1);
    printf("Case #%d: %d\n", kase, g.Maxflow(0, m+n));
  }
  return 0;
}

 

 

 

 

分享到:
评论

相关推荐

    强大的分布式ETL数据流利器—LogCollector-2.0

    LogCollector是一套基于ETL数据分析模型的分布式数据流系统,同时适用于云域内网数据传送和跨云数据传送;同时支持Windows和Linux双系统平台(内置JRE8.X);同时支持实时传送、离线传送和断点续传;同时支持组件化...

    前端开源库-stream-collector

    1. **最大缓冲大小**:可以设置一个最大缓冲大小,当达到这个大小时,即使流未结束,也会触发回调。 2. **流控制**:可以暂停和恢复数据收集,以适应不同的处理速度和场景需求。 3. **错误处理**:在流处理过程中...

    lucene collector的使用

    分组统计在信息检索中是一种常见的需求,它允许我们按照某些字段(如类别、日期等)对结果进行分类,以便更好地理解数据分布。在Lucene中,可以使用FieldValueHitQueue和FieldDocSortedHitQueue来实现分组。这些类...

    BLOODBORNE Collector’s Edition Guide_300-dpi.pdf

    weka可用的版本,很不错,集成了很多算法

    10129 - Ultimate Collector's Rebel Snowspeeder.mpd

    10129 - Ultimate Collector's Rebel Snowspeeder.mpd

    10179 - Ultimate Collector's Millennium Falcon.mpd

    10179 - Ultimate Collector's Millennium Falcon.mpd

    Laravel开发-collector-snds

    本主题聚焦于“Laravel开发-collector-snds”,这是一个专门为处理来自Microsoft SND(可能是"Service Notification Data"的缩写)通知的工具或库。这个加载项设计的目标是帮助开发者更有效地管理和响应来自微软系统...

    信息收集工具Fastir_Collector-master.zip

    《信息收集工具Fastir_Collector的深度解析与应用》 在网络安全领域,信息收集是进行渗透测试、安全审计及威胁情报分析的重要环节。而Fastir_Collector是一款高效的信息收集工具,它专为安全专家和研究人员设计,...

    Lucene5学习之自定义Collector

    这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...

    Laravel开发-stats-collector

    **Laravel开发-stats-collector** 在现代Web应用开发中,数据统计和监控是不可或缺的一部分,它们帮助开发者了解应用的运行状况、性能瓶颈以及用户行为。`Laravel开发-stats-collector` 是一个专为Laravel框架设计...

    Collector(网络资源收集器)

    Collector是一款专为网络资源收集设计的工具,它简化了用户获取网页内容,包括文本、图片以及Flash等多媒体元素的过程。这款软件的目的是帮助用户高效地管理和保存他们在互联网上浏览到的信息,尤其对于研究、写作...

    数据汇聚Streamsets Data Collector安装部署详细文档

    流批一体数据汇聚工具Streamsets Data Collector(SDC)安装部署运维文档

    datacollector, StreamSets DataCollector连续大数据摄取基础架构.zip

    datacollector, StreamSets DataCollector连续大数据摄取基础架构 什么是StreamSets数据收集器?StreamSets数据收集器是一个企业级,开放源码,连续大数据收集基础设施。 它有一个先进且容易使用的用户界面,使数据...

    Android代码-LogCollector:一个收集 app 输出日志的工具

    LogCollector 一个收集 app 输出日志的工具,输出文件:模拟器是 /sdcard/Android/data/项目包名/cache/,真机是 /Android/data/项目包名/cache/,里面的 crash 目录是崩溃日志,log 目录是 logcat 日志。 如何使用 ...

    Laravel开发-collector-common

    在本文中,我们将深入探讨`Laravel开发-collector-common`这一主题,这是一个专门为Laravel框架设计的收集器公共帮助程序包。Laravel是一款基于PHP的开源Web应用框架,以其优雅的语法和强大的功能深受开发者喜爱。`...

    A-Tune-Collector用于各类系统资源的数据采集,也可以作为A-Tune项目的采集器

    A-Tune-Collector是一款专为收集系统资源数据而设计的工具,它在IT行业中扮演着重要角色,特别是在系统监控和性能优化方面。A-Tune-Collector不仅能够收集基础的硬件和软件信息,还可能涉及更深入的系统状态,如CPU...

    Fastir_Collector-master.zip

    标题中的"Fastir_Collector-master.zip"是一个压缩文件,其中包含了名为"Fastir_Collector-master"的项目源代码。这个项目很可能是一个用于网络安全检测的信息收集工具。在IT行业中,这样的工具通常用于帮助安全专家...

    event-collector-1.12.zip

    《事件收集器开源项目——event-collector-1.12.zip深度解析》 在IT行业中,数据的收集、处理和分析已经成为不可或缺的一部分。"event-collector-1.12.zip"是一个专注于事件收集的开源项目,它为我们提供了一个高效...

    Collector资料收集管理器

    2、浏览网页如果乱码,请取消使用流浏览,IE5.0版本不支持MHT文件格式请使用IE5.5或以上版本。 3、最小化可以双击右下角的图标来显示主窗体。 4、收集网页数据时最好先把一个数据库关联到我的最爱,这样就可以在...

    BFSU Sentence Collector 1.0(例句提取工具)

    BFSU Sentence Collector 1.0:用于英语教学的索引工具,内置大学英语教材语料库...该工具支持正则表达式检索,如输入as \S+ as可以检索出含有as well as、as much as等短语的例句。

Global site tag (gtag.js) - Google Analytics