费用流-Wannafly Day2 TwoGraph-神题

TwoGraph

题意

在这里插入图片描述

题解

这真是一道神题,这题有两点比较难想,其中第一点是最难想的.
我们先考虑只有一张图的情况.
性质:
[1]如果给每个点匹配一条边,形成一个(点,边)(点,边)(,)对,其中点不能重复出现,边也不能重复出现.那么这些形成的图的联通块要么是树,要么是环套树.
证明性质[1]:
每个含有nnn条边的联通块中至多有n+1n+1n+1个点(如果再多就不连通了!),至少有nnn个点(因为nnn条边对应nnn个不同的点).
那么形成的要么是树,要么是环套树.

因此,我们需要做一张图,满足可以给点匹配其相连的边的网络,如下图.
当给出数据是一颗树时,cost[(1,2)]=c1,cost[(2,3)]=c2cost[(1,2)] = c1,cost[(2,3)] = c2cost[(1,2)]=c1,cost[(2,3)]=c2.
费用流建图如下.
在这里插入图片描述

至此,只有一张图的情况我们就搞完了,那么两张图,选边之间有依赖关系怎么办呢?好办!

我们实际上只需要对两张图各自建图,然后把其中一张图倒过来,源点改成汇点,然后对应边拼起来(就像两个漏斗一样).

这样每条边如果被选了,那么一定会经过图1的点,也会经过图2的点.

示例如下:
在这里插入图片描述

采坑提示

最小费用最大流:spfa找最短路
最大费用最大流:spfa找最长路

代码

#include<bits/stdc++.h>
using namespace std;#define rep(i,a,b) for(int i = a;i <= b;++i)
#define int long long
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mm = 200010;
const int maxn = 10010;
int node,src,dest,edge;
int ver[mm],flow[mm],cst[mm],nxt[mm];
int head[maxn],work[maxn],dis[maxn],q[maxn];
int tot_cost;
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;tot_cost = 0;
}
void add_edge(int u,int v,int c,int cost)
{ver[edge]=v,flow[edge]=c,nxt[edge]=head[u],cst[edge]=cost,head[u]=edge++;ver[edge]=u,flow[edge]=0,nxt[edge]=head[v],cst[edge]=-cost,head[v]=edge++;
}
int ins[maxn];
int pre[maxn];
bool Dinic_spfa()
{memset(ins,0,sizeof(ins));//memset(dis,-1,sizeof(dis));rep(i,0,maxn-1) {dis[i] = -inf;}memset(pre,-1,sizeof(pre));queue<int> Q;//int i,u,v,l,r=0;Q.push(src);dis[src] = 0,ins[src] = 1;pre[src] = -1;while(!Q.empty()){int u = Q.front();Q.pop();ins[u] = 0;for(int e = head[u];e != -1;e = nxt[e]){int v = ver[e];if(!flow[e]) continue;if(dis[v] < dis[u] + cst[e]){dis[v] = dis[u] + cst[e];pre[v] = e;if(!ins[v]) ins[v] = 1,Q.push(v);}}    	}return dis[dest] > 0;
}
int Dinic_flow()
{int i,ret=0,delta=inf;while(Dinic_spfa()){for(int i=pre[dest];i != -1;i = pre[ver[i^1]])delta = min(delta,flow[i]);for(int i=pre[dest];i != -1;i = pre[ver[i^1]])flow[i] -= delta,flow[i^1] += delta;ret+=delta;tot_cost += dis[dest]*delta;}return ret;
}
int n1,n2,m;
signed main() {ios::sync_with_stdio(false);cin >> n1 >> n2 >> m;prepare(2+n1+n2+2*m,0,n1+n2+2*m+1);rep(i,1,n1) {add_edge(0,i,1,0);}rep(i,1,n2) {add_edge(n1+i,n1+n2+2*m+1,1,0);}rep(i,1,m) {int a,b,c,d,cost;cin >> a >> b >> c >> d >> cost;add_edge(n1+n2+i,n1+n2+m+i,1,cost);add_edge(a,n1+n2+i,1,0);add_edge(b,n1+n2+i,1,0);add_edge(n1+n2+m+i,n1+c,1,0);add_edge(n1+n2+m+i,n1+d,1,0);}Dinic_flow();cout << tot_cost << endl;
}

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

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

相关文章

ASP.NET Core Web API 与 SSL

SSL一直没有真正研究过SSL&#xff0c;不知道下面的理解是否正确。SSL是Secure Sockets Layer的缩写&#xff0c;它用来保护服务器和客户端之前的通信。它是基于信任加密的概念。在介绍SSL的原理之前&#xff0c;首先介绍一下加密&#xff08;Encryption&#xff09;的概念。刷…

【模拟】聊天服务器的外部流量

聊天服务器的外部流量 题目大意&#xff1a; 有一个通讯系统&#xff0c;可以将某人邀请进来&#xff08;name&#xff09;&#xff0c;也可以将某人T出去&#xff08;-name&#xff09;&#xff0c;也可以向群中的所有人发一条信息&#xff08;name&#xff1a;…&#xff0…

GitHub宣布GitHub Education 新计划,学校可免费用企业版

今天 GitHub 宣布面向所有学校和教育机构开放 GitHub Education&#xff0c;方便学生和老师免费使用 GitHub 企业版功能&#xff0c;以及学生开发者工具包、GitHub 教室、培训等资源。2014 年&#xff0c;GitHub 推出了学生开发者工具包&#xff0c;其中包括 Azure 等云服务、G…

【dfs】聚会

聚会 题目大意&#xff1a; 有一些树&#xff0c;求深的树的深度 原题 解题思路&#xff1a; 从一个根出发&#xff0c;dfs往下搜 代码&#xff1a; #include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,t,g,w,ans,c[2…

2018 大湾区(深圳) .NET技术分享交流会 第一期

.NET Core 2.1 已于2018年5月30日正式发布&#xff0c;邀请粤港澳大湾区.NET技术专家和从业人员&#xff0c;一起分享与交流.NET技术的发展方向&#xff0c;提高粤港澳大湾区.NET技术交流氛围&#xff0c;挖掘.NET高级人才&#xff0c;为改善.NET生态系统贡献力量&#xff0c;使…

卡车

卡车 题目大意&#xff1a; 有一个卡车向里面放东西&#xff08;重量要么是一要么是二&#xff09;&#xff0c;价值不同&#xff0c;放的东西的价值之和最大是多少 原题&#xff1a; 解题思路&#xff1a; 看看数据就知道DP会MLE&#xff0c;所以要用排序来做&#xff0c;…

从明面上学习ASP.NET Core

一、前言这篇文章就是从能看到地方去学习Core&#xff0c;没有很深奥&#xff0c;也没有很难懂&#xff0c;现在我们开始吧。二、构建项目&#xff0c;引发思考创建项目的步骤真的很简单&#xff0c;你要是不会&#xff0c;我真也没法了&#xff0c;我这是创建的MVC的项目。接下…

线段树-区间的交

区间的交 题目来源 孙耀峰Segment_Tree.pdf 原创 题目描述 给定nnn个区间,[li,ri][l_i,r_i][li​,ri​],可以选出其中一些区间,设选出tottottot个,令xxx表示这tottottot个区间交的长度.求min{x,tot}min\{x,tot\}min{x,tot}n≤105,1≤xi≤yi≤nn \le 10^5,1 \le x_i \le y_i…

【DP】收银员

收银员 题目大意&#xff1a; 有n件物品&#xff0c;每件物品有他的扫描时间和价格&#xff0c;在扫描的时候可以偷物品&#xff08;一个单位时间偷一件&#xff09;&#xff0c;问最少给多少钱 原题&#xff1a; 解题思路&#xff1a; 设f[j]为偷或买共j件花的最少钱&…

.Net Core小技巧 - Swagger适配虚拟目录及二级目录

前言随着前后端分离模式与微服务架构的出现&#xff0c;Web API变得越来越重要及普遍。而后出现的网关技术&#xff0c;使开发者更倾向于使用二级/多级目录来暴露Web API&#xff0c;一是暴露的端口更少&#xff0c;方便管理&#xff1b;二是在网关中可以处理一些公共的事务&am…

好代码是管出来的——使用Git来管理源代码

软件开发过程中一个重要的产出就是代码&#xff0c;软件的编码过程一般是由一个团队共同完成&#xff0c;它是一个并行活动&#xff0c;为了保证代码在多人开发中能够顺利完成&#xff0c;我们需要使用代码版本控制工具来对代码进行统一存储&#xff0c;并追踪每一份代码的历史…

定时调度系列之Quartz.Net详解

一. 背景我们在日常开发中&#xff0c;可能你会遇到这样的需求&#xff1a;"每个月的3号给用户发信息&#xff0c;提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用…

RyuJIT的华丽转身

RyuJIT是作为.NET即时编译器的代号称谓&#xff0c;它是.NET运行时的基本组件之一。与此相反的是&#xff0c;Roslyn作为C#编译器&#xff0c;其编译C#代码成为IL字节码。然后&#xff0c;其再将IL字节码编译成相对于多种处理器的机器码。随着最近对dotnet/coreclr #18064的合并…

使用Nexus搭建私有Nuget仓库

前言Nuget是ASP .NET Gallery的一员&#xff0c;是免费、开源的包管理工具&#xff0c;专注于在.Net / .Net Core应用开发过程中第三方组件库的管理&#xff0c;相对于传统单纯的dll引用要方便、科学得多。其中nuget.org是最著名的Nuget公开库&#xff0c;但是企业内部开发的&a…

好代码是管出来的——Git的分支工作流与Pull Request

上一篇文章好代码是管出来的——使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法&#xff0c;从基本用法来看git与其它的版本控制工具好像区别不大&#xff0c;都是对代码新增、提交进行管理&#xff0c;可以查看提交历史、代码差异等功能。但实际上git有一个重…

【Floyed】小萨的烦恼(ssl 1624)

小萨的烦恼 ssl 1624 题目大意&#xff1a; 一个无向图&#xff0c;可以使其中一条道路的值除以2&#xff0c;求两个点之间的最短路 原题&#xff1a; Description 圣诞节又要到了&#xff01;小萨希望和自己心仪的MM一起出去度过一个浪漫的的圣诞节。他进行了详尽的准备…

好代码是管出来的——使用GitHub

前面的文章介绍了Git的基本概念和用法&#xff0c;本文则是基于GitHub的一个实践介绍&#xff0c;主要内容有&#xff1a;GitHub简介个人与组织仓库的创建与维护Fork与pull request小结GitHub简介GitHub是一个Git的远程代码托管平台&#xff0c;它除了提供代码托管外&#xff0…

【模拟】正方形

正方形 题目大意&#xff1a; 有三个人&#xff0c;一人一笔的画正方形&#xff0c;每个正方形是上一个正方形每条边上的中点连接而成的&#xff0c;求每个人画了多长 原题&#xff1a; 题目描述 又到暑假啦&#xff0c;Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快…

.NET Core微服务之基于IdentityServer建立授权与验证服务

一、IdentityServer的预备知识要学习IdentityServer&#xff0c;事先得了解一下基于Token的验证体系&#xff0c;这是一个庞大的主题&#xff0c;涉及到Token&#xff0c;OAuth&OpenID&#xff0c;JWT&#xff0c;协议规范等等等等&#xff0c;园子里已经有很多介绍的文章了…

在Docker中部署Asp.net core2.1以及修改发布

本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序&#xff0c;以及修改系统之后&#xff0c;发布更新。本文章采用自定义的Docker文件系统要求&#xff1a;1.服务器或本地已经安装docker一、创建一个Asp.Net Core 2.1 Web应用&#xff08;若可以熟练创建项目&#xf…