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

分析:首先要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. linux centos 7 防火墙相关

    centos 7 系统 默认是开启防火墙,而且没有打开80和8080等端口. 因此,今天配置tomcat和nginx后,分别无法正常访问 访问80和8080端口都报:502错误.(错误的网关)查询资料 ...

  2. webapi 传入参数校验

    /// <summary> /// 传入参数校验过滤器 /// </summary> public class ValidateReqModelFilter : ActionF ...

  3. studentmanagement

    package javatestywh; public class ScoreInformation { private String stunumber; private String name; ...

  4. F - Moving Points树状数组

    题:https://codeforces.com/contest/1311/problem/F 题意:给定x轴上的点以及他们的速度v,只在x轴上运动,求最小的dis之和,注意,这里的时间是可随意的,比 ...

  5. 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历

    /************************************************************************* > File Name: message.c ...

  6. CodeForces - 350B(反向建图,)

    B - Resort CodeForces - 350B B. Resort time limit per test 2 seconds memory limit per test 256 megab ...

  7. Res-net 标准版本源码差异-官方源码示例

    # resnet https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_v1.py https://gi ...

  8. MySQL--事务,隔离性和隔离级别

    事务 事务就是一组数据库操作,要么全部执行成功,要么全部执行失败,在MySQL中,事务是依靠存储引擎层实现的. ACID(Atomicity,Consistency,Isolation,Durabil ...

  9. 计蒜客 王子救公主(DFS)

    一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头君便自己一人 ...

  10. LeetCode——714. 买卖股票的最佳时机含手续费.

    给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每次交易都需要付手续费.如果你已经购买了一个 ...