hdu6582
题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价。
分析:首先要spfa求出起点到各个点的最短距离。对于一条权值为w,起点为i,终点为j的边,设dis[k]为起点到k点的距离,若dis[j]=dis[i]+w,则将该边加入另一个图里,边的容量为删除这条边的代价,则从起点到终点的最大流即为答案。。
1、首先最短路径一定在最短路图上
2、如果起点和终点不联通,就不存在这样一条最短路径,所以最短路径一定会变大;
注意看范围。。wa17发
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
const ll INF=1e18;
const int M=1e4+;
struct node{
ll u,v,nextt;
ll w;
}g[M<<],e[M<<];
ll s,t,tot1,tot2,cur[M],head1[M],head2[M],vis[M],deep[M];
ll dis[M];
void addedge1(ll u,ll v,ll w){
g[tot1].u=u;
g[tot1].v=v;
g[tot1].w=w;
g[tot1].nextt=head1[u];
head1[u]=tot1++;
}
void addedge2(ll u,ll v,ll w){
e[tot2].v=v;
e[tot2].w=w;
e[tot2].nextt=head2[u];
head2[u]=tot2++;
e[tot2].v=u;
e[tot2].w=;
e[tot2].nextt=head2[v];
head2[v]=tot2++; }
void dij(){
for(int i=;i<=t;i++)
dis[i]=INF;
// cout<<"!!"<<endl;
queue<int>que;
que.push(s);
dis[s]=;
while(!que.empty()){
ll u=que.front();
que.pop();
vis[u]=;
for(ll i=head1[u];~i;i=g[i].nextt){
ll v=g[i].v;
if(dis[v]>dis[u]+g[i].w){
dis[v]=dis[u]+g[i].w;
if(!vis[v]){
vis[v]=;
que.push(v);
}
}
}
}
} ll dd[M];
bool bfs(){
memset(deep,,sizeof(deep));
queue<int>que;
que.push(s);
deep[s]=;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head2[u];i!=-;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==){
deep[v]=deep[u]+;
if(v==t)
return true;
que.push(v);
}
}
}
return deep[t]==?false:true;
}
ll dfs(ll u,ll fl){
if(u==t)
return fl;
ll ans=,x=;
for(int i=cur[u];i!=-;i=e[i].nextt){
ll v=e[i].v;
if(e[i].w>&&deep[v]==deep[u]+){
x=dfs(v,min(e[i].w,fl-ans));
e[i].w-=x;
e[i^].w+=x;
if(e[i].w)
cur[u]=i;
ans+=x;
if(ans==fl)
return ans;
}
}
if(ans==)
deep[u]=;
return ans;
}
ll dinic(){
ll ans=;
while(bfs()){
for(int i=;i<=t;i++)
cur[i]=head2[i];
ans+=dfs(s,INF);
}
return ans;
}
int main(){
ll test;
scanf("%lld",&test);
while(test--){
ll n,m;
tot1=tot2=;
scanf("%lld%lld",&n,&m);
// cout<<tot1<<"!!"<<tot2<<endl;
s=,t=n; for(int i=;i<=n;i++)
head1[i]=head2[i]=-,vis[i]=;
while(m--){
ll u,v;
ll w;
scanf("%lld%lld%lld",&u,&v,&w);
addedge1(u,v,w);
}
dij();
// for(int i=1;i<=n;i++)
// cout<<dis[i]<<endl;
for (int i = ; i <= n; i++)
for (int j = head1[i]; ~j;j = g[j].nextt)
if (dis[g[j].u] + g[j].w == dis[g[j].v])
addedge2(g[j].u,g[j].v,g[j].w);
printf("%lld\n",dinic());
}
return ;
}
hdu6582的更多相关文章
- hdu3416+hdu6582(最短路+最大流)
题意 hdu3416: 给一个图,边不能重复选,问有多少个最短路 hdu6582: 给一个图,问最少删除边权多少的边后,最短路长度增加 分析 边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可 ...
- 【2019多校第一场补题 / HDU6582】2019多校第一场E题1005Path——最短路径+网络流
HDU6582链接 题意 在一张有向图中,有一个起点和一个终点,你需要删去部分路径,使得起点到终点的最短距离增加(并不要求需要使得距离变成最大值),且删除的路径长度最短.求删去的路径总长为多少 分析 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...
- hdu多校第一场1005(hdu6582)Path 最短路/网络流
题意: 在无向图上删边,让此图上从起点到终点的最短路长度变大,删边的代价是边长,求最小代价. 题解: 先跑一遍迪杰斯特拉,求出所有点的d[]值,然后在原图上保留所有的边(i,j)仅当i,j满足d[j] ...
- [hdu6582]Path
首先,从1和n跑一次dij,判断每一条边能否出现在最短路上,不能出现就删掉,然后将所有边建在图上,流量为边权,跑最小割即可. 1 #include<bits/stdc++.h> 2 usi ...
- 2019 Multi-University Training Contest 1 E Path(最短路+最小割)
题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...
随机推荐
- UVA 11987 - Almost Union-Find 并查集的活用 id化查找
受教了,感谢玉斌大神的博客. 这道题最难的地方就是操作2,将一个集合中的一个点单独移到另一个集合,因为并查集的性质,如果该点本身作为root节点的话,怎么保证其他点不受影响. 玉斌大神的思路很厉害,受 ...
- 药物动力学|肿瘤药物基因组研究的策略|OMIM database|PharmGKB
生命组学 同义突变虽然不改变蛋白质种类,但是影响量,修饰的稳定性. SNP vs mutation SNV单核苷酸变化,mutation,SNP是从群体角度思考的,约有1%,mutation比SNP还 ...
- [RoarCTF 2019]Easy Java
0x01知识点: WEB-INF/web.xml泄露 WEB-INF主要包含一下文件或目录: /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命 ...
- Java 知识点(一)
博主对 Java知识点的整理基于 c语言,整理内容为 Java的重点及与 c语言的差异点或编程通要知识点.水平有限,欢迎指正.(参考书籍<Java 核心技术 卷Ⅰ>) Java 的类名:名 ...
- struct stat
stat函数用来获取指定路径的文件或者文件夹的信息. //! 需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> //函 ...
- BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...
1.首先要安装好bitcoin core服务 上一篇有怎么安装 下面代码支持多钱包多地址动态调用,但让我没用使用多地址,根据自己的需要然后封装方法就好 2.引入jar JavaBitcoinRpcC ...
- 吴裕雄--天生自然 PHP开发学习:高级
<?php echo date("Y/m/d") . "<br>"; echo date("Y.m.d") . " ...
- spring boot集成MyBatis 通用Mapper 使用总结
spring boot集成MyBatis 通用Mapper 使用总结 2019年 参考资料: Spring boot集成 MyBatis 通用Mapper SpringBoot框架之通用mapper插 ...
- JS面向对象,原型,继承
ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript ...
- 使用flask_sqlalchemy操作mysql的一个测试
示例代码 from flask_sqlalchemy import SQLAlchemy from flask import Flask app=Flask(__name__) app.config[ ...