[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 }
[bzoj2400]Optimal Marks的更多相关文章
- 【BZOJ2400】Spoj 839 Optimal Marks 最小割
[BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...
- 【bzoj2400】Spoj 839 Optimal Marks 按位最大流
Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 908 Solved: 347[Submit][Stat ...
- 图论(网络流):SPOJ OPTM - Optimal Marks
OPTM - Optimal Marks You are given an undirected graph G(V, E). Each vertex has a mark which is an i ...
- SPOJ OPTM - Optimal Marks
OPTM - Optimal Marks no tags You are given an undirected graph G(V, E). Each vertex has a mark whic ...
- SP839 Optimal marks(最小割)
SP839 Optimal marks(最小割) 给你一个无向图G(V,E). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记.对于边(u,v),我们定义Cost(u,v)= ...
- [SPOJ839]Optimal Marks
[SPOJ839]Optimal Marks 试题描述 You are given an undirected graph \(G(V, E)\). Each vertex has a mark wh ...
- Optimal Marks(optimal)
Optimal Marks(optimal) 题目描述 定义无向图边的值为这条边连接的两个点的点权异或值. 定义无向图的值为无向图中所有边的值的和. 给定nn个点mm条边构成的图.其中有些点的权值是给 ...
- BZOJ2400: Spoj 839 Optimal Marks
Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其 ...
- 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割
题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...
随机推荐
- css超出隐藏显示省略号怎么设置?
当我们在进行网页前端开发的时候,一般获取文章标题,然后一行一行的显示.但是当标题过长的时候,就会造成换行显示.还有显示部分文本信息时,如果全部显示就过于繁琐,会带来不会的网页体验感.虽然我们可以使用o ...
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...
- SpringBoot+WebSocket实时监控异常
写在前面 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理. 因为 ...
- RA-28000 账号被锁定的解决办法
ORA-28000 账号被锁定的解决办法 错误场景:当使用sqlplus进行登录时报错:ORA-28000 账号被锁定.错误原因:由于oracle 11g 在默认在default概要文件中设置了密码最 ...
- exe图标消失的解决方案
步骤 win + r组合键打开运行窗口 输入cmd,回车 在终端窗口右键粘贴即可 taskkill /im explorer.exe /f cd /d %userprofile%\appdata\lo ...
- SQL Server 数据库单用户模式处理
在还原数据库bak备份文件时,由于某种原因(具体何种原因在此不进行分析)导致数据库还原后处于单用户模式,如下图: 单个用户模式导致,数据库无法打开,只能通过脚本去查询数据库内的表,然后进行查询数据,极 ...
- 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题
该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...
- Python设置Excel样式
前面已经详细讲解过使用Python对Excel表格进行读.写操作,本文主要讲解下使用Python设置Excel表格的样式. 深入学习请参考openpyxl官方文档: https://openpyxl. ...
- djago后台管理页面
from django.contrib import admin from blogtest.models import * #修改网页title和站点header.+ admin.site.site ...
- Java代理:静态代理、JDK动态代理和CGLIB动态代理
代理模式(英语:Proxy Pattern)是程序设计中的一种设计模式.所谓的代理者是指一个类别可以作为其它东西的接口.代理者可以作任何东西的接口:网络连接.存储器中的大对象.文件或其它昂贵或无法复制 ...