[bzoj2400]Optimal Marks
首先肯定每一位单独考虑,对于每一位,源点连向该位点权为0的节点inf的边,点权为1的节点连向汇点inf的边,每一条无向边拆成两条流量为1的有向边,跑最小割。
考虑一组割,一定将原图划分成源点和汇点两部分,那么左半部分都选0,右半部分都选1,那么它的代价就是割的代价,即要求最小割。
为了让点的值最小,相当于要让汇点集合的点数尽量少,那么直接从汇点搜一遍,将所有能走到的节点记为1,其他记为0即可。
还有一种做法比较神奇,将两点之间的边权增加为10000(需要大于总点数即可),然后再让源点向每一个点再连一条1的边,最小割一定是在10000最少的前提下(即图的点权最小)让源点割掉的点最少(源点割掉的每一条边都是到汇点集合的点)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 505 4 #define inf 0x3f3f3f3f 5 struct ji{ 6 int nex,to,len; 7 }e[N*20],edge[N*20]; 8 queue<int>q; 9 int E,EE,n,m,x,y,a[N],w[N],head[N],work[N],d[N]; 10 long long ans1,ans2; 11 void add(int x,int y,int z){ 12 edge[E].nex=head[x]; 13 edge[E].to=y; 14 edge[E].len=z; 15 head[x]=E++; 16 if (E&1)add(y,x,0); 17 } 18 bool bfs(){ 19 memset(d,-1,sizeof(d)); 20 q.push(0); 21 d[0]=0; 22 while (!q.empty()){ 23 int k=q.front(); 24 q.pop(); 25 for(int i=head[k];i!=-1;i=edge[i].nex) 26 if ((edge[i].len)&&(d[edge[i].to]<0)){ 27 d[edge[i].to]=d[k]+1; 28 q.push(edge[i].to); 29 } 30 } 31 return d[n+1]>=0; 32 } 33 int dfs(int k,int s){ 34 if (k>n)return s; 35 int p; 36 for(int &i=work[k];i!=-1;i=edge[i].nex) 37 if ((edge[i].len)&&(d[edge[i].to]==d[k]+1)){ 38 p=dfs(edge[i].to,min(s,edge[i].len)); 39 if (p){ 40 edge[i].len-=p; 41 edge[i^1].len+=p; 42 return p; 43 } 44 } 45 return 0; 46 } 47 int dinic(){ 48 int k,ans=0; 49 while (bfs()){ 50 memcpy(work,head,sizeof(head)); 51 while (k=dfs(0,inf))ans+=k; 52 } 53 return ans; 54 } 55 int main(){ 56 scanf("%d%d",&n,&m); 57 memset(head,-1,sizeof(head)); 58 for(int i=1;i<=n;i++)scanf("%d",&w[i]); 59 for(int i=1;i<=m;i++){ 60 scanf("%d%d",&x,&y); 61 add(x,y,10000); 62 add(y,x,10000); 63 } 64 for(int i=1;i<=n;i++) 65 if (w[i]<0)add(0,i,1); 66 else ans2+=w[i]; 67 EE=E; 68 memcpy(a,head,sizeof(a)); 69 memcpy(e,edge,sizeof(e)); 70 for(int i=0;i<31;i++){ 71 E=EE; 72 memcpy(head,a,sizeof(a)); 73 memcpy(edge,e,sizeof(e)); 74 for(int j=1;j<=n;j++) 75 if (w[j]>=0) 76 if (w[j]&(1<<i))add(j,n+1,inf); 77 else add(0,j,inf); 78 int p=dinic(); 79 ans1+=p/10000*(1LL<<i); 80 ans2+=p%10000*(1LL<<i); 81 } 82 printf("%lld\n%lld",ans1,ans2); 83 }
View Code
转载于:https://www.cnblogs.com/PYWBKTDA/p/11249672.html
[bzoj2400]Optimal Marks相关推荐
- bzoj 2400: Spoj 839 Optimal Marks(最小割)
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 873 Solved: 330 [Subm ...
- 2400: Spoj 839 Optimal Marks
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 618 Solved: 227 [Subm ...
- 【BZOJ2400】Optimal Marks
题意 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有 \(n\) 个结点 \(m\) 条边的无向图.其中的一些点的值是给定的 ...
- SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)
[题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...
- SPOJ - OPTM Optimal Marks(进制拆分+最小割)
题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的图,有 k 个点初始时就有权值 w[ i ],现在问如何给剩下的节点赋值,使得整张图的总权值和最小,每条边的权值为:w( u , v ...
- spoj839 Optimal Marks(最小割,dinic)
题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...
- Optimal Marks SPOJ - OPTM(最小割)
传送门 论文<最小割模型在信息学竞赛中的应用>原题 二进制不同位上互不影响,那么就按位跑网络流 每一位上,确定的点值为1的与S连一条容量为INF的有向边.为0的与T连一条容量为INF的有向 ...
- 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS
2400: Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MB Submit: 567 Solved: 202 [Subm ...
- poj pku图论、网络流入门题总结、汇总
poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...
最新文章
- 你还在这样学习Python吗?真的不可以
- [SimpleOJ229]隧道
- 关于使用REST API
- JAVA _构造函数
- 【杂谈】手把手带你配置深度学习环境
- 微型计算机硬件认识和拆装,贵州省习水县第一中学张天梅
- React+dva+antd的运用
- Ubuntu 配置 spark
- 干货:产品经理怎么做才能在需求评审中少挨打?
- java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)
- Go语言内置的基础类型
- 重装win 修复ubuntu引导
- android 中使用svg
- matlab与焓湿图,湿空气性质与焓湿图应用
- 第二章-用户需求分析
- bresenham算法画圆c语言,bresenham画圆算法
- 聊聊志愿填报那点事儿
- 2020校招前端面经
- 对vue的理解 什么是渐进式框架
- 硬盘分区MBR和GPT选哪个好?原来分个区还有这么多讲究!
热门文章
- 汇编复制字符串小程序笔记
- 微信终端跨平台组件 Mars 系列(三)连接超时与IPPort排序
- 【译】KNOWLEDGE EXTRACTION FROM UNSTRUCTURED TEXTS
- 又掌握了一项新技能 - 断点调试 Gradle 插件
- Android7.0新特性、新功能
- w ndows7防火墙文件名,Windows7中的防火墙是什么? 爱问知识人
- matlab中ode45如何设置,matlab 中ode45的源代码如何看懂
- Qt Dock Widgets 官方示例的翻译
- wincc 报警记录 mysql_wincc查询历史报警记录,归档数据-工业支持中心-西门子中国...
- python websocket库 安装_Python WebSocket