题目:http://acm.hdu.edu.cn/showproblem.php?pid=6582

Path

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 3747    Accepted Submission(s): 1075

Problem Description
Years later, Jerry fell in love with a girl, and he often walks for a long time to pay visits to her. But, because he spends too much time with his girlfriend, Tom feels neglected and wants to prevent him from visiting her.
After doing some research on the neighbourhood, Tom found that the neighbourhood consists of exactly n houses, and some of them are connected with directed road. To visit his girlfriend, Jerry needs to start from his house indexed 1 and go along the shortest path to hers, indexed n. 
Now Tom wants to block some of the roads so that Jerry has to walk longer to reach his girl's home, and he found that the cost of blocking a road equals to its length. Now he wants to know the minimum total cost to make Jerry walk longer.
Note, if Jerry can't reach his girl's house in the very beginning, the answer is obviously zero. And you don't need to guarantee that there still exists a way from Jerry's house to his girl's after blocking some edges.
 
Input
The input begins with a line containing one integer T(1≤T≤10), the number of test cases.
Each test case starts with a line containing two numbers n,m(1≤n,m≤10000), the number of houses and the number of one-way roads in the neighbourhood.
m lines follow, each of which consists of three integers x,y,c(1≤x,y≤n,1≤c≤109), denoting that there exists a one-way road from the house indexed x to y of length c.
 
Output
Print T lines, each line containing a integer, the answer.
 
Sample Input
1
3 4
1 2 1
2 3 1
1 3 2
1 3 3
 
Sample Output
3
 
Source
 
Recommend
We have carefully selected several similar problems for you:  6718 6717 6716 6715 6714 

题意:

给n个节点m条有向边,现在可以删去一些边,代价为边权,问最小代价删去一些边使得现在节点1到节点n的最短路不成立(如果1不可达n则答案为0)

思路:

可能有多条1到n的最短路,这些最短路组成图,以最小代价使图不连通就是求最小割,由最大流最小割定理可知,最小割等于最大流,所以我们先找出图中1到n的最短路新建一个图,在这个图上从1到n跑一边最大流就可求出答案
现在就是建图的问题,我们先得到1到n的最短路径dis[i],再得到n到1的最短路径dis1[i],再把原图中符合dis[u]+e[i].w+dis1[v]==dis[n](令e[i].w为节点u到v的边权)的边建一个新图,
在这个新图上从1到n跑一边dinic就可得到答案

注意:

调了一个下午,在bool operator(const node &a)const{return a.w<w;}中原来是要a.w<w才能让优先队列中w小的优先,如果是a.w>w则是w大的优先

 #include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int amn=1e4+;
const ll inf=1e18;
struct edge{
int from,to,nex;ll w;
}eg[amn],eg1[amn],e[amn<<|];
struct node{
int p;
ll w;
node(int pp,ll ww){p=pp;w=ww;}
bool operator<(const node &a)const{return a.w<w;} ///调了一个下午,原来是要a.w<w才行,这样优先队列中才会w小的优先,如果是a.w>w则是w大的优先
};
ll head[amn],egn,head1[amn],egn1,n,m,dis[amn],dis1[amn],vis[amn],head2[amn],egn2;
void init(int n){
egn=,egn1=,egn2=; ///egn2是跑最大流的,初始为1,这样就可以从2开始加边,这样正向边和反向边相邻储存,因为2^1=3,3^1=2...所以可以异或得到正向边反向边
for(int i=;i<=n;i++)head2[i]=head1[i]=head[i]=;
}
void add(int u,int v,ll w){ ///正向图加边
eg[++egn].nex=head[u];
head[u]=egn;
eg[egn].from=u;
eg[egn].to=v;
eg[egn].w=w;
}
void add1(int u,int v,ll w){ ///反向图加边
eg1[++egn1].nex=head1[u];
head1[u]=egn1;
eg1[egn1].from=u;
eg1[egn1].to=v;
eg1[egn1].w=w;
}
void add2(int u,int v,ll w){ ///跑最大流的新图加边
e[++egn2].nex=head2[u];
head2[u]=egn2;
e[egn2].from=u;
e[egn2].to=v;
e[egn2].w=w;
} ///以1为起点跑最短路
void dijkstra(int s){
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)dis[i]=inf;
dis[s]=;
priority_queue<node> q;
q.push(node(s,dis[s]));
while(q.size()){
int u=q.top().p;
ll w=q.top().w;q.pop();
if(w>dis[u])continue;
vis[u]=;
for(int i=head[u];i;i=eg[i].nex){
int v=eg[i].to;
if(!vis[v]&&((dis[v])>(eg[i].w)+(dis[u]))){
dis[v]=(eg[i].w)+dis[u];
q.push(node(v,(dis[v])));
}
}
}
}
///以n为起点跑最短路
void dijkstra1(int s){
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)dis1[i]=inf;
dis1[s]=;
priority_queue<node> q;
q.push(node(s,dis1[s]));
while(q.size()){
int u=q.top().p;
ll w=q.top().w;q.pop();
if(w>dis1[u])continue;
vis[u]=;
for(int i=head1[u];i;i=eg1[i].nex){
int v=eg1[i].to;
if(!vis[v]&&((dis1[v])>(eg1[i].w)+(dis1[u]))){
dis1[v]=(eg1[i].w)+dis1[u];
q.push(node(v,(dis1[v])));
}
}
}
}
///dinic最大流
queue<int> que;
ll dist[amn],src=,sink=n;
void bfs(){
memset(dist,,sizeof dist);
while(que.size())que.pop();
vis[src]=;
que.push(src);
while(que.size()){
int u=que.front();que.pop();
for(int i=head2[u];i;i=e[i].nex){
int v=e[i].to;//cout<<'>'<<e[i].w<<' '<<v<<endl;
if(e[i].w&&!vis[v]){
que.push(v);
dist[v]=dist[u]+;
vis[v]=;
}
}
}
}
int dfs(int u,ll delta){
if(u==sink)return delta;
int ret=;
for(int i=head2[u];delta&&i;i=e[i].nex)
if(e[i].w&&(dist[e[i].to]==dist[u]+)){
ll dd=dfs(e[i].to,min(e[i].w,delta));
e[i].w-=dd;
e[i^].w+=dd;
delta-=dd;
ret+=dd;
}
return ret;
}
ll maxflow(){
ll ret=;
while(){
memset(vis,,sizeof vis);
bfs();
if(!vis[sink])return ret;//cout<<'<'<<ret<<endl;
ret+=dfs(src,inf);
}
}
int main(){
int T,x,y;ll c;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&m);
init(n); ///初始化
src=,sink=n; ///设置1为源点,n为汇点
for(int i=;i<=m;i++){
scanf("%d%d%lld",&x,&y,&c);
add(x,y,c); ///正向图,为了以1为起点跑最短路
add1(y,x,c); ///反向图,为了以n为起点跑最短路
}
dijkstra(); ///以1为起点的最短路
if(dis[n]==inf){printf("0\n");continue;} ///如果1到n不可达则输出0
dijkstra1(n); ///以n为起点的最短路
for(int i=;i<=egn;i++){
// cout<<eg[i].from<<' '<<eg[i].to<<' '<<eg[i].w<<endl;
// cout<<dis[eg[i].from]<<' '<<eg[i].w<<' '<<dis1[eg[i].to]<<' '<<dis[n]<<endl<<endl;
if(dis[eg[i].from]+eg[i].w+dis1[eg[i].to]==dis[n]){ ///如果1到现在这个点u的最短路径+u到v的边权+v到n的最短路径==1到n的最短路径则u到v这条边是最短路中的一条边
add2(eg[i].from,eg[i].to,eg[i].w); ///建新图,加正向边
add2(eg[i].to,eg[i].from,); ///边权为0的反向边
}
}
printf("%lld\n",maxflow()); ///最大流等于最小割
}
}
/**
给n个节点m条有向边,现在可以删去一些边,代价为边权,问最小代价删去一些边使得现在节点1到节点n的最短路不成立(如果1不可达n则答案为0)
可能有多条1到n的最短路,这些最短路组成图,以最小代价使图不连通就是求最小割,由最大流最小割定理可知,最小割等于最大流,所以我们先找出图中1到n的最短路新建一个图,在这个图上从1到n跑一边最大流就可求出答案
现在就是建图的问题,我们先得到1到n的最短路径dis[i],再得到n到1的最短路径dis1[i],再把原图中符合dis[u]+e[i].w+dis1[v]==dis[n](令e[i].w为节点u到v的边权)的边建一个新图,
在这个新图上从1到n跑一边dinic就可得到答案
调了一个下午,在bool operator(const node &a)const{return a.w<w;}中原来是要a.w<w才能让优先队列中w小的优先,如果是a.w>w则是w大的优先
**/

[最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path的更多相关文章

  1. hiho 第116周,最大流最小割定理,求最小割集S,T

    小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...

  2. hihocoder 网络流二·最大流最小割定理

    网络流二·最大流最小割定理 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? ...

  3. [HihoCoder1378]网络流二·最大流最小割定理

    思路: 根据最大流最小割定理可得最大流与最小割相等,所以可以先跑一遍EdmondsKarp算法.接下来要求的是经过最小割切割后的图中$S$所属的点集.本来的思路是用并查集处理所有前向边构成的残量网络, ...

  4. 【codevs1907】方格取数3(最大流最小割定理)

    网址:http://codevs.cn/problem/1907/ 题意:在一个矩阵里选不相邻的若干个数,使这些数的和最大. 我们可以把它看成一个最小割,答案就是矩阵中的所有数-最小割.先把矩阵按国际 ...

  5. 牛客暑期第六场G /// 树形DP 最大流最小割定理

    题目大意: 输入t,t个测试用例 每个测试用例输入n 接下来n行 输入u,v,w,树的无向边u点到v点权重为w 求任意两点间的最大流的总和 1.最大流最小割定理 即最大流等于最小割 2.无向树上的任意 ...

  6. 2019 Multi-University Training Contest 1 Path(最短路+最小割)

    题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...

  7. 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】

    一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...

  8. 【hihocoder 1378】网络流二·最大流最小割定理

    [Link]:http://hihocoder.com/problemset/problem/1378 [Description] [Solution] 在求完最小割(最大流)之后; 可以在剩余网络中 ...

  9. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

随机推荐

  1. Andrew's Blog / 《Network Programming with Go》学习笔记

    第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...

  2. SIM卡的消失会让运营商们恐慌吗?

    ​中国移动.联通.电信三大运营商原本高高在上,每天乐滋滋地数钱数到手抽筋,但近年来移动互联网的快速普及,让运营商的制霸状态不复存在.成为众多互联网公司的"流量通道",语音.短信等业 ...

  3. 选题在线提交系统(html+JS+php)

    前言:         作为学习委员还是有挺多的事情要忙的,比如经常统计同学们的课设题目选择结果.如果老师的要求少一点,我还可以轻松一点.但是当老师对选题有种种限制的时候,自己就估计不会那么好办了.这 ...

  4. YiGo环境搭建

    软件环境 操作系统:Windows 2000+,Mac OS,AIX,RedHat linux,HP-UX等 JDK/JRE:Oracle JDK/JRE 1.8+,IBM J9 VM 1.8+,Op ...

  5. Harbor镜像漏洞扫描

    Harbor镜像漏洞扫描 闲聊:我们知道 镜像安全也是容器化建设中一个很重要的环节,像一些商业软件如:Aqua就很专业但是收费也是很昂贵的,今天我们介绍下Harbor自带的镜像扫描器. 一.安装最新版 ...

  6. maven包引入问题ClassNotFoundException: org.elasticsearch.client.Cancellable

    业务需要,做搜索功能,在springboot聚合项目下,新建了es模块module 但是在引入elasticsearch依赖的时候,出现了问题 引入相应依赖后 <dependency> & ...

  7. 从零开始打造 Mock 平台 - 核心篇

    前言 最近一直在捣鼓毕设,准备做的是一个基于前后端开发的Mock平台,前期花了很多时间完成了功能模块的交互.现在进度推到如何设计核心功能,也就是Mock数据的解析. 根据之前的需求设定加上一些思考,用 ...

  8. 微信h5页面调用第三方位置导航

    微信h5页面拉起第三方导航应用 需要准备的: 通过微信认证的公众号有备案过的域名 背景:微信公众号点击菜单栏跳到h5页面,需要用到导航功能 需求:当用户点击导航按钮时,跳转到第三方app进行导航 参考 ...

  9. Vue方式自动打开浏览器配置

    Vue方式自动打开浏览器配置 1. 通过 package.json 配置项目 // 必须是符合规范的json语法 "vue": { "devServer": { ...

  10. nes 红白机模拟器 第7篇 编译使用方法

    模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...