Optimal Marks SPOJ - OPTM(最小割)
传送门
论文《最小割模型在信息学竞赛中的应用》原题
二进制不同位上互不影响,那么就按位跑网络流
每一位上,确定的点值为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(最小割)相关推荐
- SPOJ - OPTM Optimal Marks(进制拆分+最小割)
题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的图,有 k 个点初始时就有权值 w[ i ],现在问如何给剩下的节点赋值,使得整张图的总权值和最小,每条边的权值为:w( u , v ...
- bzoj 2400: Spoj 839 Optimal Marks(最小割)
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 873 Solved: 330 [Subm ...
- SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)
[题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...
- spoj839 Optimal Marks(最小割,dinic)
题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...
- 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 567 Solved: 202 [Subm ...
- 2400: Spoj 839 Optimal Marks
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 618 Solved: 227 [Subm ...
- spoj 1693 COCONUTS - Coconuts【最小割】
s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1.跑最大流的结果即为答案. 考虑这样做的意义.最小割就是把总点集分割为两个点集S,T,使得所有\( ...
- 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)
1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
最新文章
- 在当当买了python怎么下载源代码-Python爬取当当网APP数据
- git--分支管理策略
- VHD工具-VHDTOOL
- 旅行商问题的n种解法
- Jquery对象和DOM对象---Jquery API (1)
- mysql set语句_MySQL Prepared语句简介
- Go Micro搭建简单微服务
- 002..NET MVC实现自己的TempBag
- matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)
- php对用户输入的非标准格式日期匹配
- 扫雷小游戏——简单易懂
- C语言:创建各类三角形图案
- 街篮中服务器维修什么时候能结束,街头篮球手游1月6日微信iOS维护公告 服务器扩容...
- hive学习第五章:查询
- 用友U9 UFSoft.UBF.Business.Session
- 历届试题 大臣的旅费 java
- 漫画 | Java语言是如何诞生的?
- CSP 202112-1 序列查询 python
- css文件组件化(不需要再创css文件了)
- java计算机毕业设计书香校园阅读平台源程序+mysql+系统+lw文档+远程调试
热门文章
- windows系统bat批处理 mysql 脚本启动关闭
- spring学习--基于注解 注入属性
- css5最新灵敏度,影响灵敏度的因素 - nakcy0009的专栏 - 52RD博客_52RD.com
- 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
- word 产生很多temp 不显示_word表格中文字显示到最下面的时候不自动换页-解决办法...
- python3 format用法_python3 str.format()的使用
- 若依微服务部署遇到问题
- php解析定时任务格式,php 实现定时任务简单实现
- python实现键盘记录木马_Python告诉你木马程序的键盘记录原理
- python深拷贝和浅拷贝的区别_【转】python的复制,深拷贝和浅拷贝的区别