hdu7244-Winner Prediction(22多校第十场1001 dinic最大流)
梦开始的地方
启蒙题,场上看见这题后才开始学习流。
题意
n n n 个人共进行 m 1 + m 2 m1+m2 m1+m2 场比赛,其中 m 1 m1 m1 场的结果已知,同时已知剩下 m 2 m2 m2 场中每场的参赛选手,问 1 1 1 号是否有可能获胜(即没有其他选手的胜利场次大于它)
容易想到,在剩下的 m 2 m2 m2 场中,只要有 1 1 1 号出场,那么一定贪心的使 1 1 1 号全部获胜,则其他选手在剩下 m 2 m2 m2 场中的最多获胜次数为 c n t [ 1 ] − c n t [ i ] cnt[1]-cnt[i] cnt[1]−cnt[i],其中 c n t [ i ] cnt[i] cnt[i] 为 i i i 号选手在前 m 1 m1 m1 场中的获胜次数。
建图通过源点 s s s 向所有未比赛的场次(有 1 1 1 号选手参加的不计入,下同)连容量为 1 1 1 的边,场次向两个参赛选手连容量为 1 1 1 的边,参赛选手向汇点 t t t 连容量为 c n t [ 1 ] − c n t [ i ] cnt[1]-cnt[i] cnt[1]−cnt[i] 的边,跑最大流判断是否等于未比赛场次。
参考代码
#include <bits/stdc++.h>
#define itn int
#define int long long
#define endl "\n"
#define PII pair<int, int>
using namespace std;
const int N = 1e6 + 10;
const int M = 1e6 + 10;
const itn inf = 0x3f3f3f;
const int mod = 998244353;
// const int mod = 1e9 + 7;int n, m, s, t;
int nex[M];struct Edge {int from, to, cap, flow;Edge(int f, int t, int c, int fl) {from = f;to = t;cap = c;flow = fl;}
};struct Dinic {int n, m, s, t; //结点数,边数(包括反向弧),源点编号和汇点编号vector<Edge> edges; //边表。edge[e]和edge[e^1]互为反向弧vector<int> G[N]; //邻接表,G[i][j]表示节点i和第j条边在e数组中的序号bool vis[N]; // BFS使用int d[N]; //从起点到i的距离int cur[N]; //当前弧下标void clear_all(int n) {for (int i = 0; i < n; i++)G[i].clear();edges.clear();}void clear_flow() {int len = edges.size();for (int i = 0; i < len; i++)edges[i].flow = 0;}void add_edge(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);d[s] = 0;vis[s] = 1;while (!q.empty()) {int x = q.front();q.pop();int len = G[x].size();for (int i = 0; i < len; 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, len = G[x].size();for (int& i = cur[x]; i < len; 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;}int mincut() { // call this after maxflowint ans = 0;int len = edges.size();for (int i = 0; i < len; i++) {Edge& e = edges[i];if (vis[e.from] && !vis[e.to] && e.cap > 0)ans++;}return ans;}void reduce() {int len = edges.size();for (int i = 0; i < len; i++)edges[i].cap -= edges[i].flow;}
} dinic;int cnt[N];void solve() {itn n, m1, m2;cin >> n >> m1 >> m2;memset(cnt, 0, sizeof(cnt));dinic.clear_all(n + m2 + 10);int s = 0, t = n + m2 + 1;for (int i = 1; i <= m1; i++) {int x, y, op;cin >> x >> y >> op;if (op == 1)cnt[x]++;elsecnt[y]++;}int sum = 0;for (int i = 1; i <= m2; i++) {int x, y;cin >> x >> y;if (x > y)swap(x, y);if (x == 1) {cnt[x]++;continue;}sum++;dinic.add_edge(s, i, 1);dinic.add_edge(i, x + m2, 1);dinic.add_edge(i, y + m2, 1);}int maxx = 0;for (int i = 2; i <= n; i++) {maxx = max(maxx, cnt[i]);dinic.add_edge(i + m2, t, cnt[1] - cnt[i]);}if (maxx > cnt[1]) {cout << "NO" << endl;return;}int ans = dinic.maxflow(s, t);// cout << ans << endl;if (ans == sum)cout << "YES" << endl;elsecout << "NO" << endl;
}signed main() {ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);cout << fixed << setprecision(12);int T = 1;cin >> T;while (T--)solve();return 0;
}
hdu7244-Winner Prediction(22多校第十场1001 dinic最大流)相关推荐
- 2019HDU多校第十场
(撒花!二十场打完了.虽然题解(riji)咕咕咕了好几场. 1003 Valentine's Day 传送:http://acm.hdu.edu.cn/showproblem.php?pid=6693 ...
- 牛客多校第十场F-Popping Balloons
题目连接 牛客多校F-PoppingBalloons 题意: 用枪打气球,可以横着打三次,竖着打三次,横着打可以把那一行的气球全打下来,竖着打可以把那一列的气球全打下来,但是,每两次相邻的横着打或者竖 ...
- 杭电多校第十场 hdu6434 Count 欧拉函数打表 快速打表模板
Problem I. Count Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- 【2019.08.21】2019杭电多校第十场
补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...
- 牛客多校第十场 Han Xin and His Troops(扩展中国剩余)
链接:https://ac.nowcoder.com/acm/contest/890/D 来源:牛客网 题目描述 His majesty chatted with Han Xin about the ...
- 【牛客多校第十场】Coffee Chicken
题目描述 Dr. JYY has just created the Coffee Chicken strings, denoted as S(n). They are quite similar to ...
- 2019牛客多校第十场 F.Popping Balloons
使用线段树,将(1,1+r,1+2r),(2,2+r,2+2r),(3,3+r,3+2r)以此类推,每个看成一个节点,对y进行建树,然后枚举x,维护最大值即可. 代码如下: #include<c ...
- HDU6386 Age of Moyu (2018多校第七场1001) (建虚点+堆优化dijkstra)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6386 题意: n个点m条边,每个边上有一个编号: 从一个编号走到另一个编号,需要代价1: 求1到n的最小代 ...
- HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)
HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...
最新文章
- 程序员的起床动力 | 每日趣闻
- 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS
- potplayer 多个进程_操作系统 | 进程同步与进程互斥
- cvSplit(),cv图像颜色通道分割和融合
- vmlinuz/vmlinux、Image、zImage与uImage的区别
- 我心中的你是春天的样子
- 光环PMP下午茶做题时间
- js实现滑动拼图验证码
- 操作系统的功能、作用、分类
- 共享单车变天: 竞争尚未结束,哈罗已超摩拜ofo?
- 联想y7000p怎么开启高性能模式?
- 华为云沙箱实验室的相关操作介绍
- 教程:Word中如何让参考文献编号和引用标记都是数字上标
- 那年杏花微雨,你说你是DOM
- 淘宝API开发相关的常见问题
- 代理服务器可能有问题,或地址不正确的解决方法
- PHP二维数组去除重复,重复值相加
- 古月居ROS入门21讲学习笔记P9
- 关于移动硬盘的文件系统
- python绘图案例——递归绘制分形树