jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】

正题

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3258


题目大意

一张无向图,路有边权,在想要封锁某条路可以在该路两边的任意一点设置检查站(一个站只能封锁一条路),在iii点建立一个检查站要AiA_iAi元。

求最少的费用封锁所有的最短路径,并询问封锁方案是否唯一


解题思路

先从111开始一遍最短路fff,然后从nnn开始再跑一次最短路f2f2f2

若一个点fx+f2x=fnf_x+f2_x=f_nfx+f2x=fn那么该点是1∼n1\sim n1n的某条最短路上的一个点。
若一条边fx+w=fyf_x+w=f_yfx+w=fy那么该边是某条最短路上的边。

然后我们将这些点和边拿出来跑最小割即可求出第一问。

我们考虑如何求第二问,为了优化,我们发现每一条边可以有两个权值(在两个检查点中任何一个),所以我们将一条边拆成两条边和一个中间点。

现在我们考虑求出最小割的必割边,若这些必割边的容量之和就是最小割那么这就是唯一的方案。

如何求出必割边?
∗*结论:::对于一条边x,yx,yx,y,在残量网络上sss可以到达xxxyyy可以到达ttt那么该边是必割边。

证明:在残量网络上sss可以到达xxxyyy可以到达ttt那么说明若该边不割那么sss就可以通过该边到达ttt。假设在sssxxx的路上有同样长度的一条道路且割掉后可以使sss到达xxx那么在残量网络上该边的流量必定为0,因为切割掉x−>yx->yx>y的流量也必定会经过该边所以在残量网络上sss就不可以到达xxx了。所以该假设不成立。

证毕

所以我们在残量网络上跑两次dfsdfsdfs然后一条一条边的判断即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=5010,inf=1e18;
struct Edge_Node{ll to,next,w;
}a[N*2],e[N*2];
ll T,ls[N],tot=1,n,m,c[N],f[N],dep[N],s,t,ans,cnt,flow,f2[N],get[N];
bool v[N];
queue<int> q;
void adde(ll x,ll y,ll w)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
void addl(ll x,ll y,ll w)
{e[++cnt].to=y;e[cnt].next=ls[x];ls[x]=cnt;e[cnt].w=w;
}
void spfa(ll s)
{memset(f,127,sizeof(f));for(int i=1;i<=n;i++)f[i]=inf;q.push(s);f[s]=0;v[s]=1;while(!q.empty()){ll x=q.front();q.pop();v[x]=0;for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(f[x]+e[i].w<f[y]){f[y]=f[x]+e[i].w;if(!v[y])v[y]=1,q.push(y);}}}
}
void spfa2(ll s)
{memset(f2,127,sizeof(f2));for(int i=1;i<=n;i++)f2[i]=inf;q.push(s);f2[s]=0;v[s]=1;while(!q.empty()){ll x=q.front();q.pop();v[x]=0;for(ll i=ls[x];i;i=e[i].next){ll y=e[i].to;if(f2[x]+e[i].w<f2[y]){f2[y]=f2[x]+e[i].w;if(!v[y])v[y]=1,q.push(y);}}}
}
bool bfs()
{memset(dep,0,sizeof(dep));while(!q.empty()) q.pop();q.push(s);dep[s]=1;while(!q.empty()){ll x=q.front();q.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(!dep[y]&&a[i].w){dep[y]=dep[x]+1;if(y==t) return true;q.push(y);}}}return false;
}
ll dinic(ll x,ll flow)
{ll rest=0,k;if(x==t) return flow;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[x]+1==dep[y]&&a[i].w){rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow) return flow;}}if(!rest) dep[x]=0;return rest;
}
void netflow()
{while(bfs())ans+=dinic(s,inf);
}
void dfs(ll x,ll op)
{if(get[x]) return;get[x]=op;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(!a[i^(op-1)].w) continue;dfs(y,op);}
}
int main()
{scanf("%lld",&T);while(T--){memset(ls,0,sizeof(ls));tot=cnt=1;scanf("%lld%lld",&n,&m);s=1;t=n;ans=flow=0;c[n]=inf;for(ll i=1;i<n;i++)scanf("%lld",&c[i]);for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);addl(x,y,w);addl(y,x,w);}spfa(1);spfa2(n);memset(ls,0,sizeof(ls));for(int i=1;i<=n;i++)get[i]=(f[i]+f2[i]==f[n]);for(ll i=2;i<=cnt;i++){ll x=e[i^1].to,y=e[i].to;if(!get[x]||!get[y]) continue;if(f[x]+e[i].w==f[y]){++n;adde(x,n,c[x]); adde(n,y,c[y]);}}netflow();memset(get,0,sizeof(get));dfs(1,1);dfs(t,2);for(ll i=1;i<=n;i++)for(ll j=ls[i];j;j=a[j].next)if(get[i]&&get[a[j].to]&&get[i]!=get[a[j].to])flow+=a[j].w;if(flow==ans) printf("Yes");else printf("No");printf(" %lld\n",ans);}
}

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

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

相关文章

Quartz.Net分布式任务管理平台

前言&#xff1a;我相信大多数人公司的业务上都有定时任务这么个功能&#xff0c;我们公司也不例外&#xff0c;刚来公司的时候使用Quartz.Net为我们组做了第一个任务&#xff0c;大致流程是&#xff1a;新建一个控制台程序&#xff0c;引用需要的程序集&#xff0c;Execute方法…

Sentinel(二十四)之Sentinel Dashboard中修改规则同步到ZooKeeper

转载自 Springboot使用Sentinel限流&#xff0c;集成zookeeper完成规则的持久化 上一篇简单介绍了sentinel限流的基本配置和使用&#xff0c;这一篇我们来稍微深入一点&#xff0c;看看如何将zookeeper继承进来&#xff0c;用以保存添加的流控规则。 上一篇中我们启动了dash…

微软Azure AspNetCore微服务实战第2期(内附PPT下载)

2018年1月28日&#xff0c;虽然上海的大雪在城区已经见不到踪影&#xff0c;但还是很冷。不过天气再冷&#xff0c;也阻止不了小伙伴参加活动的热情。感谢王振&#xff0c;苏老师以及微软Azure API Management的产品经理Alvin&#xff0c;给大家带来微服务实战&#xff0c;企业…

jzoj3379-查询【主席树】

正题 题目大意 给出一个有序集合AAA&#xff0c;定义Al,rA_{l,r}Al,r​表示集合内l∼rl\sim rl∼r这个范围内的数。 定义加法ABABAB表示两个集合中的所有元素(不去重)。 现在询问&#xff0c;每次询问ki,pik_i,p_iki​,pi​然后给出kik_iki​个区间[lj,rj][l_j,r_j][lj​,rj…

Sentinel(二十五)之Sentinel Dashboard同步Apollo存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel Dashboard同步Apollo存储规则 在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时&#xff0c;在文末的思考中&#xff0c;我都指出了这两套整合方案都存在一个不足之处&#…

为什么选择.NETCore?

为什么选择.NETCore&#xff1f;在开展话题之前先出一张ASP.NETCore VS Node.js的性能对比图 ASP.NET Core VS node.js&#xff1a;继续正文&#xff1a;学习新的开发框架是一项巨大的投资。您需要学习如何在新框架中编写&#xff0c;构建&#xff0c;测试&#xff0c;部署…

欢乐纪中某A组赛【2019.7.10】

前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分。 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排名 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAA…

Sentinel(二十六)之Sentinel Dashboard中修改规则同步到Nacos

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel Dashboard中修改规则同步到Nacos 上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo。下面通过这篇&#xff0c;详细介绍当使用Nacos作为配置中心之后&#xff0c;如何实现Sentin…

用C#编写Linux守护进程

如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行&#xff0c;则可以创建自定义systemd单元。今天我将为.NET Core编写两个自定义系统单元的例子。一个是运行.NET Core控制台应用程序的一种类型&#xff0c;另一个是运行ASP.NET Core Web应用程序的简单类型…

P4550-收集邮票【期望dp】

前题 ZYCdalaoZYCdalaoZYCdalao让我推这题&#xff0c;然后我只推出了fff的推导&#xff0c;我还是太菜了QVQQVQQVQ 正题 题目链接:https://www.luogu.org/problemnew/show/P4550 题目大意 nnn种&#xff0c;每次随机买一个邮票(每种的概率均等)&#xff0c;然后第kkk种要kkk元…

Nacos client SDK 订阅式请求坑

一、场景复现 &#xff08;1&#xff09;业务需求 在不同的nacos注册集群&#xff0c;不同的namespace&#xff0c;由页面发起查询nacos集群上注册的服务实例ip。 &#xff08;2&#xff09;故障现象 nacos集群配置推送push超时&#xff0c;查看nacos日志请求一直在20~30qp…

AWS Lambda现已支持.NET Core 2.0

Amazon宣称.NET Core 2.0现在已经支持AWS Lambda以及无服务器应用程序了。开发者们现在可以使用C#和.NET Core 2.0来为AWS Lambda编写代码和编写运行于AWS的无服务器应用程序了。自2017年2月Amazon开始了对C#编程语言的支持&#xff0c;这使得.NET开发者能够使用.NET Core 1.0运…

jzoj3236-矮人排队【权值线段树】

正题 题目链接:https://jzoj.net/senior/#main/show/3236 题目大意 一个序列两个操作 1XY:1\ X\ Y:1 X Y:交换XXX和YYY两个数2AB:2\ A\ B:2 A B:询问A∼BA\sim BA∼B这些数再序列中是否是连续的一段区间(不一定按顺序) 解题思路 先不考虑交换&#xff0c;对于询问我们发现它…

Nacos(一)之简介

转载自 什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现…

开源纯C#工控网关+组态软件(八)表达式编译器

一、 引子监控画面的主要功能之一就是跟踪下位机变量变化&#xff0c;并将这些变化展现为动画。大部分时候&#xff0c;界面上一个图元组件的某个状态&#xff0c;与单一变量Tag绑定&#xff0c;比如电机的运行态&#xff0c;绑定一个MotorRunning信号&#xff1b;但有些时候…

jzoj3237-间谍派遣【最小生成树,并查集】

正题 题目大意 一张图&#xff0c;第iii个点参加任务需要mkimk_imki​元&#xff0c;连接一条边需要一定费用&#xff0c;要求每个联通图都有参加任务的点&#xff0c;求最小费用。 解题思路 其实就是求若干个最小生成树然后这个最小生成树的权值就是这个棵树的所有边权加上最…

g4e基础篇#6 了解Git历史记录

Git的版本历史记录采用了与传统集中式版本管理系统完全不同的方式进行组织&#xff0c;在刚开始使用Git的时候我们往往会不知所措&#xff0c;比如看到这样的历史记录。看到这个七拐八拐的图形&#xff0c;你可能完全不知道它代表了什么。其实这正是Git的特别之处&#xff0c;G…

Nacos(二)之概念

转载自 Nacos 概念 NOTE: Nacos 引入了一些基本的概念&#xff0c;系统性的了解一下这些概念可以帮助您更好的理解和正确的使用 Nacos 产品。 地域 物理的数据中心&#xff0c;资源创建成功后不能更换。 可用区 同一地域内&#xff0c;电力和网络互相独立的物理区域。同一可…

bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3482 题目大意 一张有向图有正整数边权也有xxx边权。其中xxx可以取任何值(但是要注意所有的xxx边必须长度相等)&#xff0c;每次询问求SSS到TTT的可能最短路长度个数和它们的和。 解题思路 分层图&#xff…

Ray框架QA

Orleans与Akka对比&#xff0c;为什么选用Orleans&#xff1f;答: Akka对参与开发的人员要求更高一些&#xff0c;普遍是专家级别&#xff0c;Orleans框架进一步抽象了一层&#xff0c;结合C#语言特性&#xff0c;能普遍降低开发难度。下面是知乎网友的答案&#xff0c;可以参考…