题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价。

分析:首先要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的更多相关文章

  1. hdu3416+hdu6582(最短路+最大流)

    题意 hdu3416: 给一个图,边不能重复选,问有多少个最短路 hdu6582: 给一个图,问最少删除边权多少的边后,最短路长度增加 分析 边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可 ...

  2. 【2019多校第一场补题 / HDU6582】2019多校第一场E题1005Path——最短路径+网络流

    HDU6582链接 题意 在一张有向图中,有一个起点和一个终点,你需要删去部分路径,使得起点到终点的最短距离增加(并不要求需要使得距离变成最大值),且删除的路径长度最短.求删去的路径总长为多少 分析 ...

  3. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

  4. [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...

  5. hdu多校第一场1005(hdu6582)Path 最短路/网络流

    题意: 在无向图上删边,让此图上从起点到终点的最短路长度变大,删边的代价是边长,求最小代价. 题解: 先跑一遍迪杰斯特拉,求出所有点的d[]值,然后在原图上保留所有的边(i,j)仅当i,j满足d[j] ...

  6. [hdu6582]Path

    首先,从1和n跑一次dij,判断每一条边能否出现在最短路上,不能出现就删掉,然后将所有边建在图上,流量为边权,跑最小割即可. 1 #include<bits/stdc++.h> 2 usi ...

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

    题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...

随机推荐

  1. UVA 11987 - Almost Union-Find 并查集的活用 id化查找

    受教了,感谢玉斌大神的博客. 这道题最难的地方就是操作2,将一个集合中的一个点单独移到另一个集合,因为并查集的性质,如果该点本身作为root节点的话,怎么保证其他点不受影响. 玉斌大神的思路很厉害,受 ...

  2. 药物动力学|肿瘤药物基因组研究的策略|OMIM database|PharmGKB

    生命组学 同义突变虽然不改变蛋白质种类,但是影响量,修饰的稳定性. SNP vs mutation SNV单核苷酸变化,mutation,SNP是从群体角度思考的,约有1%,mutation比SNP还 ...

  3. [RoarCTF 2019]Easy Java

    0x01知识点: WEB-INF/web.xml泄露 WEB-INF主要包含一下文件或目录: /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命 ...

  4. Java 知识点(一)

    博主对 Java知识点的整理基于 c语言,整理内容为 Java的重点及与 c语言的差异点或编程通要知识点.水平有限,欢迎指正.(参考书籍<Java 核心技术 卷Ⅰ>) Java 的类名:名 ...

  5. struct stat

    stat函数用来获取指定路径的文件或者文件夹的信息. //! 需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> //函 ...

  6. BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...

    1.首先要安装好bitcoin core服务 上一篇有怎么安装 下面代码支持多钱包多地址动态调用,但让我没用使用多地址,根据自己的需要然后封装方法就好 2.引入jar  JavaBitcoinRpcC ...

  7. 吴裕雄--天生自然 PHP开发学习:高级

    <?php echo date("Y/m/d") . "<br>"; echo date("Y.m.d") . " ...

  8. spring boot集成MyBatis 通用Mapper 使用总结

    spring boot集成MyBatis 通用Mapper 使用总结 2019年 参考资料: Spring boot集成 MyBatis 通用Mapper SpringBoot框架之通用mapper插 ...

  9. JS面向对象,原型,继承

    ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript ...

  10. 使用flask_sqlalchemy操作mysql的一个测试

    示例代码 from flask_sqlalchemy import SQLAlchemy from flask import Flask app=Flask(__name__) app.config[ ...