`

LA2531 The K-League 最大流(公平分配问题)

 
阅读更多

 

//题目给出T,表示T组测试数据。n表示队伍数,2*n个整数表示
//每队已经赢和输的次数。n*n个数,表示第i和第j队还需要比赛的次数。
//求还有机会赢的所有队伍数。
//分析:
//判断i是否可以成为冠军,就让i在接下来的比赛中全部获胜,局数为totle。
//再看看剩下的每场比赛是否能让两支队伍相互制约,是任何一支队伍获胜的局数
//都小于totle。把每场比赛看做一个点(u,v),从s点到它的容量为还需要比赛的次数,
//再把一支队伍(u)也看做是一个点,到t点的容量为totle-win[u],然后(u,v)到
//(u)和(v)的容量为INF,这样从s流入,从t流出能达到满载(流入==流出),说明
//i队有机会赢(说明别的队伍可以相互制约),也可以这样理解,如果流入!=流出,就
//说明有支队伍成为了瓶颈,卡住了,也就是成为瓶颈的那支队伍不能制约对手,使对手
//赢得场数大于totle

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn = 700;
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 init(int n) {
    for(int i = 0; i < n; i++) G[i].clear();
    edges.clear();
  }

  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;

const int maxt = 25 + 5;
int n, w[maxt], d[maxt], a[maxt][maxt];
//ID为那么多点的编号
inline int ID(int u, int v) { return u*n+v+1; }
inline int ID(int u) { return n*n+u+1; }

bool canWin(int team) {
  // 计算team全胜后的总胜利场数
  int total = w[team];
  for(int i = 0; i < n; i++)
    total += a[team][i];
  for(int i = 0; i < n; i++)
    if(w[i] > total) return false;

  // 构图。s=0, 结点(u,v)的编号为u*n+v+1, 结点u的编号为n^2+u+1, t=n^2+n+1
  g.init(n*n+n+2);
  int full = 0;
  int s = 0, t = n*n+n+1;//源点和汇点
  for(int u = 0; u < n; u++) {
    for(int v = u+1; v < n; v++)if(u != team && v != team) {
      if(a[u][v] > 0) g.AddEdge(s, ID(u,v), a[u][v]); // S到(u,v)的弧
      full += a[u][v];//计算满载的容量
      g.AddEdge(ID(u,v), ID(u), INF); // (u,v)到u的弧
      g.AddEdge(ID(u,v), ID(v), INF); // (u,v)到v的弧
    }
    if(w[u] < total) g.AddEdge(ID(u), t, total-w[u]); // u到T的弧
  }
  return g.Maxflow(s, t) == full;
}

int main() {
  int T;
  scanf("%d", &T);
  while(T--) {
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d%d", &w[i], &d[i]);
    for(int i = 0; i < n; i++)
      for(int j = 0; j < n; j++)
        scanf("%d", &a[i][j]);

    bool first = true;
    for(int i = 0; i < n; i++)
      if(canWin(i)) {
        if(first) first = false; else printf(" ");
        printf("%d", i+1);
      }
    printf("\n");
  }
  return 0;
}

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    alien-league.zip_alienleague_fonts

    《外星联盟字体:Alien-League Font for OSX》 在设计和排版领域,字体的选择至关重要,它能够赋予文本独特的视觉效果和情感表达。今天我们要介绍的是一款名为"Alien-League"的字体系列,专为OSX操作系统设计,提供...

    rec-league-parser:各种娱乐体育联盟网站的网页抓取工具

    《rec-league-parser:娱乐体育联盟网站的网页抓取利器》 在互联网时代,大量数据隐藏在各个网站的页面中,对于喜欢分析体育赛事、娱乐活动的爱好者和专业研究者而言,能够有效地抓取并解析这些数据显得尤为重要。...

    Analyzing-the-Premier-League

    本项目"Analyzing-the-Premier-League"正是基于这一背景,利用Jupyter Notebook这一强大的数据分析平台,对英超联赛的数据进行深度挖掘与分析。 Jupyter Notebook是一种交互式计算环境,它允许用户将代码、解释性...

    League.Akari-1.2.1-win.7z

    League.Akari-1.2.1-win.7z

    Cricket-Summer-League

    "Cricket-Summer-League"项目,作为一个以JavaScript为核心技术的板球夏季联赛管理系统,充分展示了编程语言在体育领域的强大潜力。本文将深入探讨JavaScript在该项目中的应用及其重要性。 首先,JavaScript是Web...

    rocket-league-replays:重播火箭联赛的数据库和解析器

    火箭联赛重播 火箭联盟重播是一个狂热...$ cd rocket-league-replays/ 创建并激活虚拟环境(推荐) 注意:我使用的是pyvenv,但是您也可以使用virtualenv,virtualenvwrapper或其他任何替代方法。 $ pyvenv-3.5 .venv

    shopee-code-league-2021

    shopee-code-league-2021

    yii2-league-oauth2-server:Yii 2.0 实现 PHP 联盟 OAuth2 服务器接口

    总结起来,`yii2-league-oauth2-server`项目为我们提供了一个在Yii 2.0框架中实施OAuth2服务器接口的起点。通过配置存储、定义端点和处理请求,我们可以构建一个符合PHP联盟标准的认证和授权系统,从而保护我们的API...

    soccer-league-web-scraping:从静态网页中抓取英格兰足球联赛的数据

    Soccer-League-Web-Scraping 从静态网页中抓取英格兰足球联赛的数据。 但是对于动态网页需要 webdriver --- RSelenium。 source('C:/Users/Scibrokes Trading/Documents/GitHub/englianhu/Soccer-League-Web-...

    mancala-league:地下曼卡拉联赛的服务器

    先决条件您需要什么东西来安装软件以及如何安装它们git clone https://github.com/AlvaroGarciaJaen/mancala-league.gitcd mancala-league 我们建议在安装要求之前使用 : virtualenv envsource env/bin/activatepip...

    Shopee-Code-League-2021

    尽管提供的标签为空,我们可以从“Shopee-Code-League-2021-main”这个压缩包文件名推测,其中可能包含了比赛的主要代码库或者资源。 参赛者们可能需要掌握以下关键知识点: 1. **Web开发**:Shopee作为一个电商...

    wave-league.github.io

    【标题】"wave-league.github.io" 是一个基于GitHub Pages托管的个人或项目网站,通常用于展示个人作品、项目介绍或者技术分享。这个标题暗示我们将会探讨一个与网页开发相关的项目,很可能是一个静态网站,利用HTML...

    SHOPEE-CODE-LEAGUE-2021

    Shopee Code League是一个为期3周的编码挑战赛,包括3个编码竞赛,面向该地区的所有学生和专业人员。 由Shopee技术团队专门设计的竞赛涉及数据分析,数据科学和算法问题。 参与者必须分析数据集,得出有见地的结论,...

    MTB-Fantasy-League-App

    "MTB-Fantasy-League-App" 是一个专为山地自行车爱好者设计的幻想联赛应用程序。这个项目可能允许用户创建自己的虚拟车队,选择他们心目中的顶级车手,并根据真实比赛中车手的表现来获得积分。作为一款正在开发中的...

    tennis-league-organizer:帮助您组织非官方网球联赛的软件

    【tennis-league-organizer】是一款专为网球爱好者设计的软件,旨在协助用户轻松地组织非官方网球联赛。这款应用程序采用Java编程语言开发,保证了跨平台的兼容性,无论您是Windows、Mac还是Linux用户,都能享受到它...

    League Skins-crx插件

    《League Skins-crx插件:为Facebook增添英雄联盟元素》 在当今互联网时代,个性化与定制化的体验已经成为用户追求的一大热点。对于热爱游戏的用户来说,能够在日常使用的平台上找到与自己兴趣相符的元素,无疑会...

    Bug-Byte-League-wolf-pack:黑客马拉松回购

    "Bug-Byte-League-wolf-pack" 是一个与黑客马拉松相关的项目,从标题来看,我们可以推断这可能是一个团队或组织在Bug Byte League黑客马拉松活动中所创建的项目,可能包含了参赛者们开发的各种代码、文档或者资源。...

    space-league:基于以太坊的RPG

    $ git clone :botanki / space-league.git 转到存储库的目录并安装依赖项: $ cd space-league && npm安装启动Ganache CLI: $ ganache-cli -i 919293-确定性打开第二个终端以将合同编译和迁移(部署)到开发网络...

    cc-shopee-code-league-2021:我们团队成员的共同工作空间

    【标题】:“cc-shopee-code-league-2021:我们团队成员的共同工作空间” 这个标题揭示了这是一个团队协作项目,很可能与Shopee(一个东南亚知名的电商平台)的编程竞赛“Shopee Code League 2021”有关。团队成员在...

Global site tag (gtag.js) - Google Analytics