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节点的最短路径增大 ...
随机推荐
- Codeforces Round #620 (Div. 2)D dilworld定理
题:https://codeforces.com/contest/1304/problem/D 题意:给定长度为n-1的只含’>'和‘<’的字符串,让你构造出俩个排列,俩个排列相邻的数字之 ...
- sublime中设置scala编译运行
Attention: 前提.前提.前提:电脑上安装scala和jdk,可以在cmd中运行scala命令: okay,next: 1.配置内容 在Tools->Build Systems-> ...
- JavaScript学习总结(五)
之前的几讲中我们曾经说过,JavaScript中是没有类的概念的.但是我们讲过对象,那么这个对象是怎么来的呢? 只要有函数即可创建对象 自定义对象 自定义对象的方式: 1. 使用无参的函数创建对象 & ...
- Django2.0——中间件
Django中间件middleware本质是一个类,在请求到返回的中间,类中不同的方法会在指定的时机中被触发.setting.py的变量MIDDLEWARE_CLASSES中的每一个元素都是中间件,且 ...
- Dynamics CRM - 利用 JavaScript 打开指定 entity 的新建窗口并传递需要的参数
由于业务逻辑需要,需要从某个 Entity 的 Record 中弹出其他 Entity 的创建窗口,并将当前 Entity 中的某些值传递到新打开的窗口中,具体的 JS 代码如下: //定义一个参数对 ...
- MBProgressHUD覆盖键盘
发送消息的时候,需要用MBProgressHUD来覆盖窗口等待发送成功,但是无论如何键盘都覆盖不上. 于是各种研究,添加到view,添加到window,都无果..想破了脑子,总觉得加到window都覆 ...
- 基于Guava实现的文件复制
需求:现需要将文件D:\A\B\C\abc.txt进行一下操作 1.在文件夹D:\A\B\C下,没有以abc命名的文件夹则创建 2.将目标文件D:\A\B\C\abc.txt复制到abc下 实现代码: ...
- 吴裕雄--天生自然 JAVA开发学习:switch case 语句
public class Test { public static void main(String args[]){ //char grade = args[0].charAt(0); char g ...
- ios swift 判断uiviewcontroller时push present 进来的 还是pop进来的
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //显示navbar self.navi ...
- MySQL笔记(一)
MySQL是目前最流行的关系型数据库管理系统之一,它是由MySQL AB公司开发.发布并支持.MySQL是一个跨平台的开源关系型数据库管理系统,被广泛地应用在internet上的中小型网站开发中.相比 ...