题意

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. C语言实现常用数据结构——链表

    #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; ...

  2. Python时间戳的一些使用

    Python时间戳的一些使用 为什么写下这篇文档? 由于我本身是做Python爬虫的,在爬取网站的过程当中,会遇到形形色色的验证码,目前对于自己而言,可能简单的验证码可以进行自己识别 发现大多数的网站 ...

  3. 利用Shell开发MySQL的启动脚本

    MySQL实例部署情况 01:MySQL程序安装目录:/data/apps/mysql 02:MySQL实例3306的配置文件为:/data/mysql/3306/my.cnf 03:MySQL实例3 ...

  4. Django之用户认证auth模块使用

    Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ...

  5. rm、shutdown、磁盘挂载、vi使用方法

    1. 系统管理文件 1.1 rm 文件与目录有关命令 删除命令 (慎用)    --- 数据是否备份了 rm === remove rm /oldboy/oldboy.txt  --- 删除文件 rm ...

  6. 使用Core Audio实现VoIP通用音频模块

    最近一直在做iOS音频技术相关的项目,由于单项直播SDK,互动直播SDK(iOS/Mac),短视频SDK,都会用到音频技术,因此在这里收集三个SDK的音频技术需求,开发一个通用的音频模块用于三个SDK ...

  7. spring boot 2.x 系列 —— spring boot 整合 redis

    文章目录 一.说明 1.1 项目结构 1.2 项目主要依赖 二.整合 Redis 2.1 在application.yml 中配置redis数据源 2.2 封装redis基本操作 2.3 redisT ...

  8. docker无法启动

    docker无法启动 docker启动时报错Error starting daemon: SELinux is not supported with the overlay2 graph driver ...

  9. django启动入口源码分析

    manage.py是启动入口,在里面调用execute_from_command_line(sys.argv)方法 def execute_from_command_line(argv=None): ...

  10. BZOJ 1085:[SCOI2005]骑士精神(A*算法)

    题目链接 题意 中文题意. 思路 首先找到空白的格子,因为空白的格子可以和其他的骑士换.从空白的点开始搜索,每次和其他点交换.因为最多只有十五步,可以做16次搜索,搜索的时候,记录走过的步数和至少剩余 ...