梦开始的地方

启蒙题,场上看见这题后才开始学习流。

题意

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最大流)相关推荐

  1. 2019HDU多校第十场

    (撒花!二十场打完了.虽然题解(riji)咕咕咕了好几场. 1003 Valentine's Day 传送:http://acm.hdu.edu.cn/showproblem.php?pid=6693 ...

  2. 牛客多校第十场F-Popping Balloons

    题目连接 牛客多校F-PoppingBalloons 题意: 用枪打气球,可以横着打三次,竖着打三次,横着打可以把那一行的气球全打下来,竖着打可以把那一列的气球全打下来,但是,每两次相邻的横着打或者竖 ...

  3. 杭电多校第十场 hdu6434 Count 欧拉函数打表 快速打表模板

    Problem I. Count Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  4. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

  5. 牛客多校第十场 Han Xin and His Troops(扩展中国剩余)

    链接:https://ac.nowcoder.com/acm/contest/890/D 来源:牛客网 题目描述 His majesty chatted with Han Xin about the ...

  6. 【牛客多校第十场】Coffee Chicken

    题目描述 Dr. JYY has just created the Coffee Chicken strings, denoted as S(n). They are quite similar to ...

  7. 2019牛客多校第十场 F.Popping Balloons

    使用线段树,将(1,1+r,1+2r),(2,2+r,2+2r),(3,3+r,3+2r)以此类推,每个看成一个节点,对y进行建树,然后枚举x,维护最大值即可. 代码如下: #include<c ...

  8. HDU6386 Age of Moyu (2018多校第七场1001) (建虚点+堆优化dijkstra)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6386 题意: n个点m条边,每个边上有一个编号: 从一个编号走到另一个编号,需要代价1: 求1到n的最小代 ...

  9. 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 ...

最新文章

  1. 程序员的起床动力 | 每日趣闻
  2. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS
  3. potplayer 多个进程_操作系统 | 进程同步与进程互斥
  4. cvSplit(),cv图像颜色通道分割和融合
  5. vmlinuz/vmlinux、Image、zImage与uImage的区别
  6. 我心中的你是春天的样子
  7. 光环PMP下午茶做题时间
  8. js实现滑动拼图验证码
  9. 操作系统的功能、作用、分类
  10. 共享单车变天: 竞争尚未结束,哈罗已超摩拜ofo?
  11. 联想y7000p怎么开启高性能模式?
  12. 华为云沙箱实验室的相关操作介绍
  13. 教程:Word中如何让参考文献编号和引用标记都是数字上标
  14. 那年杏花微雨,你说你是DOM
  15. 淘宝API开发相关的常见问题
  16. 代理服务器可能有问题,或地址不正确的解决方法
  17. PHP二维数组去除重复,重复值相加
  18. 古月居ROS入门21讲学习笔记P9
  19. 关于移动硬盘的文件系统
  20. python绘图案例——递归绘制分形树

热门文章

  1. azure_Azure Functions长大
  2. 大二学生--腾讯CSIG测开面经
  3. 如何把浏览器不信任的网址设置为可信任的网点
  4. htmlimg图片加载失败_img图片不存在显示默认图
  5. VS watch(监视)的技巧
  6. 微信检测工具 微信筛选技巧
  7. ARM学习(1) 寄存器的理解 ===》FP、SP、LR寄存器
  8. 自动驾驶坐标系变换:欧拉角法
  9. 芯片温升估算与实际测试
  10. 水木joke十月画月刊