首页 > 编程语言 >2022“杭电杯”中国大学生算法设计超级联赛(10)1001 // 最大流

2022“杭电杯”中国大学生算法设计超级联赛(10)1001 // 最大流

时间:2022-10-26 12:44:39浏览次数:85  
标签:10 le 比赛 idx int ++ 每场 2022 杭电杯

题目来源:2022“杭电杯”中国大学生算法设计超级联赛(10)1001 - Winner Prediction

题目链接:Problem - 7244 (hdu.edu.cn)


题意

给定 \(T\) 组案例。

对于每组案例:

给定人数 \(n\),已知结果的比赛场数 \(m_1\),尚未进行的比赛场数 \(m_2\)。每场比赛,比赛双方中有且仅有一个胜者。在进行完所有比赛后,获胜场数最多的人为冠军(可并列冠军)。

若 \(1\) 号可能获得冠军输出 YES,否则输出 NO

数据范围:\(1 \le T \le 100\),\(1 \le n \le 500\),\(1 \le m_1,m_2 \le 1000\).

思路:最大流

记 \(a_i\) 为 \(i\) 当前的获胜场数,对于未进行的比赛中有 \(1\) 参与的比赛,令 \(1\) 均获胜。

若 \(2\) 号 到 \(n\) 号中,有 \(a_i > a_1\),直接可以知道答案为 NO

再考虑一般情况。

因为要让 \(1\) 成为最终的冠军,\(i\) 最多只能再赢得 \(a_1 - a_i\) 场比赛。我们将剩下的比赛(假设有 \(m\) 场)和所有人视作点,从源点向每场比赛建立一条容量为 \(1\) 的边,每场比赛再向比赛双方各建一条容量为 \(1\) 的边,对于 \(2\) 到 \(n\) 中 的人,向汇点建一条容量为 \(a_1 - a_i\) 的边。

建图之后,dicnic求出最大流,若最大流等于 \(m\),说明每场比赛都分配了输赢的结果,即存在让 \(1\) 成为冠军的可能,答案为 YES,否则为 NO

时间复杂度:\(O(能过)\).

代码

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

const int N = 1510;
const int M = (2000 + N) * 2;
const int INF = 0x3f3f3f3f;

int n, m1, m2, m, a[N], S, T;
pair<int,int> matchs[N];
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];

void add(int a, int b, int c)
{
    e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++;
    e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++;
}

bool bfs()
{
    int hh = 0, tt = -1;
    memset(d, -1, sizeof d);
    q[++ tt] = S, d[S] = 0, cur[S] = h[S];
    while(hh <= tt) {
        int t = q[hh ++];
        for(int i = h[t]; ~i; i = ne[i]) {
            int ver = e[i];
            if(d[ver] == -1 && f[i]) {
                d[ver] = d[t] + 1, cur[ver] = h[ver];
                if(ver == T) return true;
                q[++ tt] = ver;
            }
        }
    }
    return false;
}

int find(int u, int limit)
{
    if(u == T) return limit;
    int flow = 0;
    for(int i = cur[u]; ~i && flow < limit; i = ne[i]) {
        int ver = e[i];
        if(d[ver] == d[u] + 1 && f[i]) {
            int t = find(ver, min(f[i], limit - flow));
            if(!t) d[ver] = -1;
            f[i] -= t, f[i ^ 1] += t, flow += t;
        }
    }
    return flow;
}

int dicnic()
{
    int r = 0, flow;
    while(bfs()) {
        while(flow = find(S, INF)) r += flow;
    }
    return r;
}

void solve()
{
    memset(h, -1, sizeof h);
    idx = 0, m = 0;

    cin >> n >> m1 >> m2;
    for(int i = 1; i <= n; ++ i) a[i] = 0;
    for(int i = 1; i <= m1; ++ i) {
        int x, y, z;
        cin >> x >> y >> z;
        if(z) ++ a[x];
        else ++ a[y];
    }
    for(int i = 1; i <= m2; ++ i) {
        int x, y;
        cin >> x >> y;
        if(min(x, y) == 1) ++ a[1];
        else matchs[++ m] = { x, y };
    }

    for(int i = 2; i <= n; ++ i) {
        if(a[i] <= a[1]) continue;
        cout << "NO" << endl;
        return;
    }

    S = 0, T = n + m + 1;
    for(int i = 1; i <= m; ++ i) {
        int x = matchs[i].first, y = matchs[i].second;
        add(S, i, 1);
        add(i, m + x, 1), add(i, m + y, 1);
    }
    for(int i = 2; i <= n; ++ i) add(m + i, T, a[1] - a[i]);
    
    cout << (dicnic() == m ? "YES" : "NO") << endl;
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    int test;
    cin >> test;
    while(test--) solve();

    return 0;
}

标签:10,le,比赛,idx,int,++,每场,2022,杭电杯
From: https://www.cnblogs.com/jakon/p/16827918.html

相关文章

  • Java知识10 变量类型【多测师】
    类变量(静态变量):独立于方法之外的变量用static修饰实例变量:独立于方法之外的变量没有static修饰//必须先创建一个对象实例化局部变量(类方法中的变量):类的方法中的变量......
  • 10.25 解题报告
    T1用时:1.5h赛时\(30\)min切了,对着错大样例调了\(1\)h。#include<bits/stdc++.h>#definelllonglong#defineintlonglong//#defineullunsignedlonglong#......
  • kubeSphere v3.3.0+kubemetes v1.22.10 集群部署
    概述KubeSphere是 GitHub 上的一个开源项目,是成千上万名社区用户的聚集地。很多用户都在使用KubeSphere运行工作负载。对于在Linux上的安装,KubeSphere既可以部署......
  • 2022 年上海市大学生程序设计竞赛 - 十月赛 B. Questions on Binary Tree
    给定一棵n个节点的完全二叉树以及m次询问,每次询问需要计算给定节点在先序遍历的顺序。思路就是从给定的节点不断向上跳,如果当前节点是左儿子则给答案+1,是右儿子则给答案+1......
  • MySQL数据库中int(3)和int(10)的区别【杭州多测师_王sir】【杭州多测师】
    int(M)在integer数据类型中,M表示最大显示宽度。在int(M)中,M的值跟int(M)所占多少存储空间并无任何关系。int(3)、int(4)、int(8)在磁盘上都是占用4btyes的存......
  • 【2022-10-21】连岳摘抄
    23:59愉快可以使你对生命的每一跳动,对于生活的每一印象易于感受,不管躯体或精神上的愉快都是如此,可以使身体发展,身体强健。              ......
  • 20221026 英文单词
    1、provision 2、wrestle   3、admittance  4、authorize  5、asset  6、image  7、apprenticeship  8、business  9、getyour......
  • 【2022-10-22】连岳摘抄
    23:59当一个人能够如此单纯,如此觉醒,如此专注于当下,毫无疑虑地走过这个世界,生命真是一件赏心乐事。                      ......
  • 行业领先的界面控价DevExpress 10月新版——v22.1.6发布
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具。屡获......
  • .NET周报【10月第3期 2022-10-25】
    国内文章聊一聊被.NET程序员遗忘的COM组件https://www.cnblogs.com/huangxincheng/p/16799234.html将Windows编程中经典的COM组件拿出来再复习一下,解释了COM组件互......