codeforces gym-101736 Dessert First Strategy 最小割

题目

题目链接

题解

很典型的最小割模型问题,我们知道颜色不确定的点最终要么是白色,要么是黑色,是两种对立的状态,我们联想到了最小割。
最小割是割掉权值和最小的边集,使得图中的点分成两个点集,一个包含ss点,一个包含t点,与这道题的要求非常相似。

我们构建3组点。
一组是确定为白色的点,与ss相连,流量为inf
一组是确定为黑色的点,与tt相连,流量为inf
一组是颜色不确定的点,如果该点与白的的点之间有边,那么就在该点与白色的点之间连接一条对应流量的边。如果与黑色的点有边相连,类似。

这样的话,跑一遍最小割/最大流,被割掉的边就代表权值不能被取到的,由于割是最小的,所以剩下的是最大的。

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int inf = 1e9;
const int maxm = 300001;
const int maxn = 1001;
int node,src,dest,edge;
int ver[maxm],flow[maxm],nxt[maxm];
int head[maxn],work[maxn],dis[maxn],q[maxn];
void prepare(int _node,int _src,int _dest)
{node=_node,src=_src,dest=_dest;for(int i=0; i<node; ++i)head[i]=-1;edge=0;
}
void add_edge(int u,int v,int c)
{ver[edge]=v,flow[edge]=c,nxt[edge]=head[u],head[u]=edge++;ver[edge]=u,flow[edge]=0,nxt[edge]=head[v],head[v]=edge++;
}
bool Dinic_bfs()
{int i,u,v,l,r=0;for(i=0; i<node; ++i)dis[i]=-1;dis[q[r++]=src]=0;for(l=0; l<r; ++l)for(i=head[u=q[l]]; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]<0){dis[q[r++]=v]=dis[u]+1;if(v==dest)return 1;}return 0;
}
int Dinic_dfs(int u,int exp)
{if(u==dest)return exp;for(int &i=work[u],v,tmp; i>=0; i=nxt[i])if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0){flow[i]-=tmp;flow[i^1]+=tmp;return tmp;}return 0;
}
int Dinic_flow()
{int i,ret=0,delta;while(Dinic_bfs()){for(i=0; i<node; ++i)work[i]=head[i];while(delta=Dinic_dfs(src,inf))ret+=delta;}return ret;
}
typedef pair<int,int> pii;
vector<pii> vec[100007];
int n,k,p,qq,tmp;
int kind[205];
int pkind[100007];
int G[205][205];
int ans;
int mxcut;
#define pr(x) cout<<#x<<":"<<x<<endl
void dfs(int u,int fa){for(pii p : vec[u]){int v = p.first,c = p.second;int k1 = kind[pkind[u]];int k2 = kind[pkind[v]];if(u > v) goto s;if(pkind[u] == pkind[v]) {ans += c;goto s;}if(k1 && k2){if(k1 == k2) ans += c;}if(!k1 && !k2){add_edge(pkind[u],pkind[v],c),mxcut += c;}if(k1 && !k2){if(k1 == -1) add_edge(pkind[u],pkind[v],c),mxcut += c;if(k1 == 1 ) add_edge(pkind[v],pkind[u],c),mxcut += c;}if(!k1 && k2){if(k2 == -1) add_edge(pkind[v],pkind[u],c),mxcut += c;if(k2 == 1 ) add_edge(pkind[u],pkind[v],c),mxcut += c;}
s:      if(v != fa) dfs(v,u);}
}
int lp,rp;
int main(){scanf("%d %d %d %d",&n,&k,&p,&qq);for(int i = 1;i <= p;++i) scanf("%d",&tmp),kind[tmp] -= 1;for(int i = 1;i <= qq;++i) scanf("%d",&tmp),kind[tmp] += 1;for(int i = 1;i <= n;++i) scanf("%d",&tmp),pkind[i] = tmp;prepare(k+2,0,k+1);for(int i = 1;i <= k;++i) {if(kind[i] == -1) add_edge(0,i,inf);if(kind[i] == 1 ) add_edge(i,k+1,inf);}for(int i = 1;i < n;++i){int u,v,c;scanf("%d%d%d",&u,&v,&c);vec[u].push_back(make_pair(v,c));vec[v].push_back(make_pair(u,c));}dfs(1,0);ans += mxcut - Dinic_flow();cout<<ans<<endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Windows 下如何使用 AspNetCore Api 和 consul

一、概念&#xff1a;什么是consul:Consul 是有多个组件组成的一个整体&#xff0c;作用和Eureka,Zookeeper相当&#xff0c;都是用来做服务的发现与治理。 Consul的特性&#xff1a;1、 服务的发现&#xff1a;consul可以把注册到其中的服务提供给使用者&#xff0c;也可以主动…

CF590E-Birthday【AC自动机,最大独立集】

正题 题目链接:https://www.luogu.com.cn/problem/CF590E 题目大意 nnn个字符串&#xff0c;求一个最大的集合使其中没有任何串是其他集合内字符串的子串 解题思路 先用ACACAC自动机建立好failfailfail树传递闭包就可以确定好两两之间的子串关系了&#xff0c;之后用网络流最…

【最短路】【SPFA】电车 (luogu 1346)

电车 luogu 1346 题目大意&#xff1a; 有n个点&#xff0c;要从一个点到另一个点&#xff0c;每个点连接着其他ai个点&#xff0c;到连接的第一个点路径长度为0&#xff0c;其他长度为1&#xff0c;求最短路 题目描述 在一个神奇的小镇上有着一个特别的电车网络&#xff…

网络流及建模专题(下)

前言 不断更新中… 专题的(下)篇将介绍网络流的一些奇奇怪怪的应用和费用流有关的一些套路。 本专题暂时包含三道题&#xff1a; 洛谷P1251 餐巾计划问题: 费用流的基本应用 Trade Gym - 100212I: 使用网络流对图论中的边进行调整 codeforces 818G - Four Melodies: 费用…

CentOS 7.4 下 如何部署 AspNetCore 结合 consul

上篇我们讲到consul的概念&#xff0c;以及在WIN下如何使用&#xff1a; 在Windows 下如何使用 AspNetCore Api 和 consul步骤如下&#xff1a;1、安装虚拟机VM 2、下载安装 CentOS 7.4&#xff08;地址就不提供了&#xff09;这是安装示例&#xff1a; VM虚拟机安装CentOS 示例…

P4083-[USACO17DEC]A Pie for a Pie G【线段树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4083 题目大意 开始时AAA和BBB各有两个礼物&#xff0c;每个礼物对两个人有不同的价值&#xff0c;开始时AAA会送BBB一个礼物。 对于一个收到礼物的人&#xff0c;如果该礼物对他来说价值为valvalval&#xff0c;那么他会回…

【SPFA】最优贸易(luogu 1073)

最优贸易 luogu 1073 题目大意&#xff1a; 有n个城市和m条线路连接着这些城市&#xff08;当编号为1时是有向&#xff0c;2时是无向&#xff09;&#xff0c;从1城市出发到n城市&#xff0c;每个城市都有固定的水晶球价格&#xff08;进价和售价一样&#xff09;&#xff0…

Razor Page Library:开发独立通用RPL(内嵌wwwroot资源文件夹)

Demo路径&#xff1a;https://github.com/yanshengjie/RPL.Demo1. IntroductionRazor Page Library 是ASP.NET Core 2.1引入的新类库项目&#xff0c;属于新特性之一&#xff0c;用于创建通用页面公用类库。也就意味着可以将多个Web项目中通用的Web页面提取出来&#xff0c;封装…

Problem H Rock Paper Scissors,FFT

题目 题目链接 题意 给出两段石头剪刀布的顺序SS和T" role="presentation" style="position: relative;">TT&#xff0c;其中TT要短一些,现在让你把T" role="presentation" style="position: relative;">TT往SS的…

CF1066F-Yet another 2D Walking【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF1066F 题目大意 平面上有nnn个点&#xff0c;每个点在max(x,y)max(x,y)max(x,y)层&#xff0c;走第kkk层的点之前一定要先走前面层的点&#xff0c;求走完所有点的最短路。 解题思路 对于每一层来说&#xff0c;我们可以将…

【最短路】【SPFA】城市问题(ssl 1761)

城市问题 ssl 1761 题目大意&#xff1a; 求一个点到其它点的最短路 原题&#xff1a; Description 设有n个城市&#xff0c;依次编号为0&#xff0c;1&#xff0c;2&#xff0c;……&#xff0c;n-1&#xff08;n<100&#xff09;&#xff0c;另外有一个文件保存n个城…

.NET Core微服务之基于Ocelot实现API网关服务

一、啥是API网关&#xff1f;API 网关一般放到微服务的最前端&#xff0c;并且要让API 网关变成由应用所发起的每个请求的入口。这样就可以明显的简化客户端实现和微服务应用程序之间的沟通方式。以前的话&#xff0c;客户端不得不去请求微服务A&#xff08;假设为Customers&am…

P3157 动态逆序对 ,树状数组套动态开点线段树

题目 洛谷题目链接 题解 在求整体的逆序对的数量时&#xff0c;很好办&#xff0c;直接用树状数组处理即可&#xff0c;不过在这时&#xff0c;我们还需要处理出一个数组pa[]pa[]pa[]&#xff0c;其中pa[i]pa[i]pa[i]代表在区间[1,i)[1,i)[1,i)中满足aj>aia_j>a_iaj​…

【DP】猫咪的进化

猫咪的进化 题目大意&#xff1a; 有n个实数&#xff0c;每一个实数可以选&#xff0c;可以不选&#xff0c;也可以选择它的平方&#xff0c;但如果选择了它的平方&#xff0c;就不能选择下一个数或下一个数的平方&#xff0c;求选出来的数的和最大是多少 原题&#xff1a; …

[8.21NOIP模拟赛]决战【tarjan】

正题 题目大意 nnn个点mmm条边的联通图&#xff0c;去掉一个点使得其变为一棵树 求能去掉哪些点 解题思路 首先去掉后就是一棵n−1n-1n−1个节点的树&#xff0c;也就是有n−2n-2n−2条边&#xff0c;这样我们就需要去掉m−n2m-n2m−n2条边&#xff0c;也就是去掉入度为m−n2…

[译]RabbitMQ教程C#版 - 发布订阅

先决条件本教程假定RabbitMQ已经安装&#xff0c;并运行在localhost标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或证书&#xff0c;则需要调整连接设置。从哪里获得帮助如果您在阅读本教程时遇到困难&#xff0c;可以通过邮件列表联系我们。1.发布/订阅…

P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案

题目 洛谷题目链接 题解 题目的数据范围非常奇怪&#xff0c;一半是200∗200200∗200的矩阵&#xff0c;另一半是1∗500001∗50000的矩阵&#xff0c;显然是一道二合一的题目&#xff0c;但是不一样的地方也就在与数据结构的选择不一样&#xff0c;而我们解这道题使用的算法…

nssl1511-我的世界【堆,贪心】

正题 题目大意 nnn个点的一棵树&#xff0c;给每一个点一个权值&#xff0c;每个点的依靠点是与它相连的权值最小的点&#xff0c;要求每个点最多只有一个依赖点。 求字典序最小的方案 解题思路 首先最小的一定是叶子结点&#xff0c;然后他的父节点指向他&#xff0c;因为它…

【SPFA】【最短路/次短路】GF打Dota

GF打Dota 题目大意&#xff1a; 求一个点到另一个点的最短路或次短路 原题&#xff1a; 题目描述 众所周知&#xff0c;GF同学喜欢打dota&#xff0c;而且打得非常好。今天GF和Spartan同学进行了一场大战。现在GF拿到一张地图&#xff0c;地图上一共有n个地点&#xff0c;…

用ASP.NET Core 2.1 建立规范的 REST API -- 缓存和并发

本文所需的一些预备知识可以看这里: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 和 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) 准备项目建立Richardson成熟度2级的POST、GET、PUT、PATCH、DELETE的RESTful API请看这里&#xff1a;用ASP.NET Core …