SPOJ 839 Optimal Marks(经典二进制最小割)
发布日期:2021-06-30 10:23:25
浏览次数:2
分类:技术文章
本文共 1888 字,大约阅读时间需要 6 分钟。
胡伯涛的论文里的例题。
给定一个无向图,有些点有编号,没有编号的点需要你指定
最后这张图的权值是 ∑ ( u , v ) ∈ E m a r k u ⊕ m a r k v \sum\limits_{(u,v)\in E}mark_u\oplus mark_v (u,v)∈E∑marku⊕markv
最小化这个权值,输出你构造的编号
思路非常巧妙
因为异或运算非常难顶,但是异或的话,每一位二进制是独立的
所以可以把二进制拆分,现在只考虑最小化第 i i i位的二进制贡献
问题变成了每个点是0或者1,有些点指定了,有些点需要你来加
那么如果一条边的两个点数字相同不需要计算贡献,不相同计算贡献
想到了什么??最小割!!
把 S S S点集看作数字 1 1 1, T T T点集看作数字 0 0 0
那么 S S S向已编号的数字为 1 1 1的点连流量为 i n f inf inf得边
已编号的数字为 0 0 0的点向 T T T连流量 i n f inf inf的边
对于原图的边 ( u , v ) (u,v) (u,v),彼此间连流量 1 1 1的边即可
这样就分成了两个点集
#includeusing namespace std;#define int long longconst int maxn=2e5+10; const int inf=1e12;struct edge{ int to,nxt,flow;}d[maxn]; int head[maxn],cnt=1;void add(int u,int v,int flow){ d[++cnt] = (edge){ v,head[u],flow},head[u]=cnt; d[++cnt] = (edge){ u,head[v],0},head[v]=cnt;}int id[maxn],p[maxn],l[maxn],r[maxn],ans[maxn];int n,m,k,s,t,dis[maxn];bool bfs(){ queue q; for(int i=0;i<=t;i++) dis[i]=0; q.push(s); dis[s]=1; while( !q.empty() ) { int u=q.front(); q.pop(); for(int i=head[u];i;i=d[i].nxt ) { int v=d[i].to; if( d[i].flow&&dis[v]==0 ) { dis[v]=dis[u]+1; q.push(v); } } } return dis[t]!=0;}int dinic(int u,int flow){ if( u==t ) return flow; int res=flow; for(int i=head[u];i&&res;i=d[i].nxt ) { int v=d[i].to; if( dis[v]==dis[u]+1&&d[i].flow ) { int temp = dinic(v,min(d[i].flow,res )); res-=temp; d[i].flow-=temp,d[i^1].flow+=temp; if( temp==0 ) dis[v]=0; } } return flow-res;}signed main(){ int T; cin >> T; while( T-- ) { cin >> n >> m; for(int i=1;i<=m;i++) scanf("%lld%lld",&l[i],&r[i]); int k; cin >> k; for(int i=1;i<=k;i++) scanf("%lld%lld",&id[i],&p[i]); for(int i=0;i<=30;i++)//枚举每一位二进制 { s=0,t=n+1,cnt=1; for(int j=0;j<=t;j++) head[j]=0; for(int j=1;j<=m;j++) { add(l[j],r[j],1); add(r[j],l[j],1); } for(int j=1;j<=k;j++) if( p[j]&(1<
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/109367828 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月17日 16时07分50秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
“学硕” VS “专硕”
2019-04-30
【NLP学习笔记】知识图谱阅读笔记及其心得
2019-04-30
【工具使用】新版CSDN-markdown编辑器使用指南
2019-04-30
《知识图谱》阅读笔记(六)
2019-04-30
【NLP学习笔记】中文分词(Word Segmentation,WS)
2019-04-30
【NLP学习笔记】词性标注(Part-of-speech Tagging, POS)
2019-04-30
《知识图谱》阅读笔记(七)
2019-04-30
《知识图谱》阅读笔记(九)
2019-04-30
【超越白皮书7】你需要知道关于ETH2.0的几个事实
2019-04-30
超越白皮书8:穿云而过的闪电网络
2019-04-30
AMM做市无常损失对冲分析系列(一)—— 损益及期权对冲模型构建
2019-04-30
JS中document对象和window对象有什么区别
2019-04-30
dlsym调用,报错undefinedsymbol:
2019-04-30
2021-01-21
2019-04-30
【python学习】变量
2019-04-30
【python学习】运算符
2019-04-30
【python学习】分支结构
2019-04-30
【python学习】循环结构
2019-04-30
【python学习】函数
2019-04-30