题意

hdu3416:

给一个图,边不能重复选,问有多少个最短路

hdu6582:

给一个图,问最少删除边权多少的边后,最短路长度增加

分析

边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可以先跑出最短路,再把最短路中的边作为网络流中的边跑一遍最大流即可。

最短路长度增加即最短路这个子图不再联通,要使一个图不再联通的最小代价显然就是最小割,也等于最大流。

找出最短路中的边的方法是从s正着跑一遍最短路,再从t逆着跑一遍最短路,如果\(low[u]+rev[v]+w==low[t]\),则\((u,v)\)为最短路中的边。

代码(hdu6582)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+50;
const ll INF=1e18;
int T,n,m;
int uu[N],vv[N];
ll ww[N];
vector<pair<int,int> > g[N];
ll low[N],rev[N];
bool vis[N];
struct node{
int v;
ll c;
bool operator<(const node &rhs)const{
return c>rhs.c;
}
};
void dijkstra(int s,ll low[]){
for(int i=1;i<=n;i++){
low[i]=INF;
vis[i]=false;
}
low[s]=0;
priority_queue<node> pq;
pq.push(node{s,low[s]});
while(!pq.empty()){
node tmp=pq.top();
pq.pop();
int u=tmp.v;
if(vis[u]){
continue;
}
vis[u]=true;
int siz=g[u].size();
for(int i=0;i<siz;i++){
int v=g[u][i].first;
ll w=g[u][i].second;
if(!vis[v] && low[v]>low[u]+w){
low[v]=low[u]+w;
pq.push(node{v,low[v]});
}
}
}
}
struct Edge{
int v,w,next;
}edge[N*2];
int cnt,head[N];
void init(){
cnt=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w){
edge[cnt]=Edge{v,w,head[u]};
head[u]=cnt++;
edge[cnt]=Edge{u,0,head[v]};
head[v]=cnt++;
}
int dep[N];
bool bfs(){
memset(dep,0,sizeof(dep));
dep[1]=1;
queue<int> q;
q.push(1);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
ll w=edge[i].w;
if(w>0 && dep[v]==0){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[n]!=0;
}
int cur[N];
ll dfs(int u,ll flow){
if(u==n){
return flow;
}
for(int &i=cur[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
ll w=edge[i].w;
if(dep[v]==dep[u]+1 && w>0){
int dis=dfs(v,min(w,flow));
if(dis>0){
edge[i].w-=dis;
edge[i^1].w+=dis;
return dis;
}
}
}
return 0;
}
ll dinic(){
ll ans=0;
while(bfs()){
for(int i=1;i<=n;i++){
cur[i]=head[i];
}
while(ll d=dfs(1,INF)){
ans+=d;
}
}
return ans;
}
int main(void){
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
g[i].clear();
}
for(int i=0;i<m;i++){
scanf("%d%d%lld",&uu[i],&vv[i],&ww[i]);
g[uu[i]].push_back({vv[i],ww[i]});
}
dijkstra(1,low);
for(int i=1;i<=n;i++){
g[i].clear();
}
for(int i=0;i<m;i++){
g[vv[i]].push_back({uu[i],ww[i]});
}
dijkstra(n,rev);
init();
for(int i=0;i<m;i++){
if(uu[i]!=vv[i] && low[uu[i]]+rev[vv[i]]+ww[i]==low[n]){
add(uu[i],vv[i],ww[i]);
}
}
ll ans=dinic();
printf("%lld\n",ans);
}
return 0;
}

hdu3416+hdu6582(最短路+最大流)的更多相关文章

  1. hdu5294||2015多校联合第一场1007 最短路+最大流

    http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...

  2. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  3. 【最短路+最大流】上学路线@安徽OI2006

    目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...

  4. P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)

    第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ...

  5. HDU-3416 Marriage Match IV 最短路+最大流 找各最短路的所有边

    题目链接:https://cn.vjudge.net/problem/HDU-3416 题意 给一个图,求AB间最短路的条数(每一条最短路没有重边.可有重复节点) 思路 首先把全部最短路的边找出来,再 ...

  6. hdu3416 最短路+最大流

    题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就 ...

  7. hdu3416 Marriage Match IV【最短路+最大流】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297581.html   ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...

  8. hdu3416 Marriage Match IV 最短路+ 最大流

    此题的大意:给定一幅有向图,求起点到终点(都是固定的)的不同的最短路有多少条.不同的最短路是说不能有相同的边,顶点可以重复.并且图含有平行边. 看了题以后,就想到暴力,但是暴力往往是不可取的.(暴力的 ...

  9. hdu3416 判断最短路是否唯一(每条边只能走一次)

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. Scala 学习之路(四)—— 数组Array

    一.定长数组 在Scala中,如果你需要一个长度不变的数组,可以使用Array.但需要注意以下两点: 在Scala中使用(index)而不是[index]来访问数组中的元素,因为访问元素,对于Scal ...

  2. Spark学习之路(七)—— 基于ZooKeeper搭建Spark高可用集群

    一.集群规划 这里搭建一个3节点的Spark集群,其中三台主机上均部署Worker服务.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002和hadoop00 ...

  3. angular安装

    安装时间:20190703安装环境:win10 1 安装Nodejs 1.1 下载地址:https://nodejs.org/en/ 1.2 下载完成之后双击安装,安装完成之后无需配置环境变量(安装的 ...

  4. Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...

  5. 转载 make版MYsql 5.5.13

    使用cmake安装mysql5.5.132014-04-09 12:59:42 分类: Mysql/postgreSQL 原文地址:使用cmake安装mysql5.5.13 作者:isqlw 安装cm ...

  6. Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)

    That there's some good in this world, Mr. Frodo. And it's worth fighting for. 原型模式(prototype),用原型实例指 ...

  7. 【数据库】Navicat Premium12远程连接MySQL数据库

    目录 00. 目录 01. 环境介绍 02. Navicat安装 03. MySQL开启远程登录权限 04. Navicat连接MySQL 00. 目录 @ 参考博客:https://blog.csd ...

  8. JavaScript 常见的六种继承方式

    JavaScript 常见的六种继承方式 前言 面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分 ...

  9. 从零到一,利用kubeadm在ubuntu server 16.04 64位系统离线安装kubernetes v1.10.0

    说明 初步接触kubernets,记录学习过程 本教程目的利用kubeadm在ubuntu server 16.04 64位系统离线安装kubernets v1.10.0 环境信息 节点IP地址 角色 ...

  10. spark入门(三)键值对操作

    1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...