当前位置: 首页 > news >正文

“蔚来杯“2022牛客暑期多校训练营10 EF题解

E-Reviewer Assignment

题目大意:
有n个审稿人和m篇论文,要求给每个审稿人安排一篇论文,给出每个审稿人能够审的论文集合。
定义f(i)为至少被i个审稿人审核的论文数量,要求f(1),f(2),...,f(n)组成的字典序最大。输出每个审稿人都审核哪篇论文。
数据范围:1<= n,m <=400

思路:
首先注意到题目中的点数是比较少的,所以用邻接矩阵存图跑最大流的话可以很方便的知道流量的流向。
那么可以这样建图:
源点向每个审稿人连一条容量为1的边,每个审稿人向能够审的论文连一条容量为1的边,每篇论文向汇点连一条容量为x的边,x从1取到n,一共跑n次最大流,相当于每次在上一次的基础上找增广路,不会影响到上一次的f值,这样就可以让f(1),f(2),...,f(n)的字典序最大了。
如何得到流向:例如审稿人x和论文y,如果边xy的容量为0,yx的容量不为0,说明审稿人x审的就是论文y。

F-Shannon Switching Game?

题目大意:
给定一个无向图,初始时有一个token在s点,两个玩家Join Player和Cut Player轮流行动,Cut Player先动。Cut Player每次可以移除一条和token所在位置相邻的边, Join Player每次可以将token沿着一条未删除边移动, 如果token在某刻被移动到t则Join Player获胜,否则Cut Player获胜,求双方最优策略下的胜者。

思路:
当时想到了一个点到t点如果有两种路径的话,那么这个点一定可以到达。不过当时直接跑dfs找点超时了。
题解给的做法是维护一个点的集合。集合中初始有一个点t。如果一个没有在集合中的点有两条以上的边连向集合里的点,那么这个点肯定也可以归到集合中。不断重复这个过程,最后判断s点是否在集合中即可。

至于为什么要从t开始扩展集合而不是从s开始扩展,下面这组数据可以进行说明:

1
1 4 1 3
1 3
1 2
2 3
2 3

显然结果是Join Player,但是从s开始扩展的话结果是Cut Player。

AC代码:

#include <bits/stdc++.h>
#define mem(a, v) memset(a, v, sizeof(a))
const int N = 1e2 + 5;
using namespace std;

struct edge
{
    int to, next;
} e[2 * N * N];
int head[N], ecnt;
void add(int u, int v) { e[++ecnt].next = head[u], e[ecnt].to = v, head[u] = ecnt; }
void einit()
{
    ecnt = 0;
    for (int i = 0; i < N; i++)
        head[i] = 0;
}
int d[N];
bool vis[N];
void solve()
{
    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t;
    einit();
    mem(d, 0);
    mem(vis, 0);
    while (m--)
    {
        cin >> u >> v;
        add(u, v);
        add(v, u);
    }
    queue<int> q;
    q.push(t);
    vis[t] = 1;
    while (q.size())
    {
        u = q.front();
        q.pop();
        for (int i = head[u]; i; i = e[i].next)
        {
            v = e[i].to;
            if (vis[v]) continue;
            d[v]++;
            if (d[v] >= 2)
            {
                vis[v] = 1;
                q.push(v);
            }
        }
    }
    if (d[s] >= 2)
        cout << "Join Player\n";
    else
        cout << "Cut Player\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

相关文章:

  • 人工智能科学计算库—Numpy教程
  • i.MX6ULL应用移植 | 基于ubuntu base 16.04搭建python3.9+pip3环境
  • vim文本编辑器
  • 网课搜题接口
  • 网课查题API接口(免费)
  • 超分辨率重建DRRN
  • MacOS 环境编译 JVM 源码
  • Linux内核互斥技术1
  • 【RHCE-第五天作业】
  • MFCC--学习笔记
  • 领航杯2022年-Crypto-rsa
  • 黄北断裂和渤南2号断裂
  • JS逆向之巨量算数signature与data解密
  • 网站收录查询-批量网站收录查询软件
  • Docker - 镜像的分层 - busybox镜像制作
  • [笔记] php常见简单功能及函数
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ES6--对象的扩展
  • java8 Stream Pipelines 浅析
  • Java超时控制的实现
  • JSDuck 与 AngularJS 融合技巧
  • Mithril.js 入门介绍
  • Phpstorm怎样批量删除空行?
  • ReactNative开发常用的三方模块
  • Service Worker
  • socket.io+express实现聊天室的思考(三)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vuex 学习笔记 01
  • 浏览器缓存机制分析
  • 收藏好这篇,别再只说“数据劫持”了
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Hibernate主键生成策略及选择
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $L^p$ 调和函数恒为零
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (二)换源+apt-get基础配置+搜狗拼音
  • (万字长文)Spring的核心知识尽揽其中
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)Sublime Text3配置Lua运行环境
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 反射 Reflect
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net连接oracle数据库
  • .NET是什么
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @html.ActionLink的几种参数格式
  • @property python知乎_Python3基础之:property
  • [ 数据结构 - C++]红黑树RBTree