传送门

论文《最小割模型在信息学竞赛中的应用》原题

二进制不同位上互不影响,那么就按位跑网络流

每一位上,确定的点值为1的与S连一条容量为INF的有向边。为0的与T连一条容量为INF的有向边。

其他的按给定的无向图建边,容量为1。

统计答案是从源点能到达的点(流量未达到容量)即为该位上为1的点。

需要跑多少遍根据所有权值的最高位来确定。直接跑30次TLE了。

#include <bits/stdc++.h>
using namespace std;inline int read() {int x = 0, f = 1; char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') { x = x * 10 + ch - 48; ch = getchar(); }return x * f;
}const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
struct Edge { int v, next, f; } edge[N];
struct IN { int u, v; } in[N];
int head[N], cnt, level[N], iter[N], n, m;
int a[N], res[N];
bool vis[N];
vector<int> appear;inline void add(int u, int v, int f) {edge[cnt].v = v; edge[cnt].f = f; edge[cnt].next = head[u]; head[u] = cnt++;
}bool bfs(int s, int t) {for (int i = 0; i <= t; i++) level[i] = -1, iter[i] = head[i];queue<int> que;que.push(s);level[s] = 0;while (!que.empty()) {int u = que.front(); que.pop();for (int i = head[u]; ~i; i = edge[i].next) {int v = edge[i].v, f = edge[i].f;if (level[v] < 0 && f) {que.push(v);level[v] = level[u] + 1;}}}  return level[t] != -1;
}int dfs(int u, int t, int f) {if (u == t || !f) return f;int flow = 0;for (int i = iter[u]; ~i; i = edge[i].next) {iter[u] = i;int v = edge[i].v;if (level[v] == level[u] + 1 && edge[i].f) {int w = dfs(v, t, min(f, edge[i].f));if (!w) continue;flow += w; f -= w;edge[i].f -= w; edge[i^1].f += w;if (f <= 0) break;}  }return flow;
}int dinic(int s, int t) {int ans = 0;while (bfs(s, t)) ans += dfs(s, t, INF);return ans;
}void get_ans(int u, int bit) {vis[u] = 1;res[u] += 1 << bit;for (int i = head[u]; ~i; i = edge[i].next) {int v = edge[i].v;if (!vis[v] && edge[i].f) {get_ans(v, bit);}}
}void solve(int bit, int s, int t) {for (int i = 0; i <= t; i++) head[i] = -1, vis[i] = false;cnt = 0;for (int i = 0, sz = appear.size(); i < sz; i++) {int x = appear[i];if ((1 << bit) & a[x]) {add(s, x, INF);add(x, s, 0);} else {add(x, t, INF);add(t, x, 0);}}for (int i = 1; i <= m; i++) { add(in[i].u, in[i].v, 1); add(in[i].v, in[i].u, 1); }dinic(s, t);get_ans(s, bit);
}inline void init() {for (int i = 0; i <= n; i++) {res[i] = a[i] = 0;}appear.clear();
}int main() {int T = read();while (T--) {n = read(), m = read();init();int s = 0, t = n + 1;int mak = 0;for (int i = 1; i <= m; i++) {in[i].u = read(), in[i].v = read();   }int k = read();while (k--) {int u = read();a[u] = read();appear.emplace_back(u); }for (int i = 0, sz = appear.size(); i < sz; i++) {int u = appear[i];int temp = a[u];int bit = 0;while (temp) {bit++;temp >>= 1;   }mak = max(bit, mak);}for (int i = 0; i <= mak; i++) {solve(i, s, t); }for (int i = 1; i <= n; i++) printf("%d\n", res[i]);}
}

View Code

转载于:https://www.cnblogs.com/Mrzdtz220/p/10929205.html

Optimal Marks SPOJ - OPTM(最小割)相关推荐

  1. SPOJ - OPTM Optimal Marks(进制拆分+最小割)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的图,有 k 个点初始时就有权值 w[ i ],现在问如何给剩下的节点赋值,使得整张图的总权值和最小,每条边的权值为:w( u , v ...

  2. bzoj 2400: Spoj 839 Optimal Marks(最小割)

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 873  Solved: 330 [Subm ...

  3. SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)

    [题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...

  4. spoj839 Optimal Marks(最小割,dinic)

    题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...

  5. 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 567  Solved: 202 [Subm ...

  6. 2400: Spoj 839 Optimal Marks

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 618  Solved: 227 [Subm ...

  7. spoj 1693 COCONUTS - Coconuts【最小割】

    s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1.跑最大流的结果即为答案. 考虑这样做的意义.最小割就是把总点集分割为两个点集S,T,使得所有\( ...

  8. 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)

    1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...

  9. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

最新文章

  1. 在当当买了python怎么下载源代码-Python爬取当当网APP数据
  2. git--分支管理策略
  3. VHD工具-VHDTOOL
  4. 旅行商问题的n种解法
  5. Jquery对象和DOM对象---Jquery API (1)
  6. mysql set语句_MySQL Prepared语句简介
  7. Go Micro搭建简单微服务
  8. 002..NET MVC实现自己的TempBag
  9. matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)
  10. php对用户输入的非标准格式日期匹配
  11. 扫雷小游戏——简单易懂
  12. C语言:创建各类三角形图案
  13. 街篮中服务器维修什么时候能结束,街头篮球手游1月6日微信iOS维护公告 服务器扩容...
  14. hive学习第五章:查询
  15. 用友U9 UFSoft.UBF.Business.Session
  16. 历届试题 大臣的旅费 java
  17. 漫画 | Java语言是如何诞生的?
  18. CSP 202112-1 序列查询 python
  19. css文件组件化(不需要再创css文件了)
  20. java计算机毕业设计书香校园阅读平台源程序+mysql+系统+lw文档+远程调试

热门文章

  1. windows系统bat批处理 mysql 脚本启动关闭
  2. spring学习--基于注解 注入属性
  3. css5最新灵敏度,影响灵敏度的因素 - nakcy0009的专栏 - 52RD博客_52RD.com
  4. 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
  5. word 产生很多temp 不显示_word表格中文字显示到最下面的时候不自动换页-解决办法...
  6. python3 format用法_python3 str.format()的使用
  7. 若依微服务部署遇到问题
  8. php解析定时任务格式,php 实现定时任务简单实现
  9. python实现键盘记录木马_Python告诉你木马程序的键盘记录原理
  10. python深拷贝和浅拷贝的区别_【转】python的复制,深拷贝和浅拷贝的区别