(点击此处查看原题)

题目分析

题意:给出一个有n个结点,m条单向边的有向图,问从源点s到汇点t的不重合的最短路有多少条,所谓不重复,意思是任意两条最短路径都不共用一条边,而且任意两点之间的边只会用一条。

思路:没有看出是最大流的话,可能会止步于用dijkstra得到所有的所有最短路包含的边,但是无法确定最多有多少条路。

但是学过网络流的人走到这一步就会想到这里需要用最大流求解:我们将每一条最短路上的边构成新的图,这个图中的边的边权都是1,在这个由最短路中的边组成的图中,求得的s-t最大流即为我们所求的答案。

代码区

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#include<fstream>
#include<vector>
#include<stack>
#include <map>
#include <iomanip> #define bug cout << "**********" << endl
#define show(x, y) cout<<"["<<x<<","<<y<<"] "
#define LOCAL = 1;
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll mod = ;
const int Max = 1e5 + ;
const int Max2 = 1e3+; struct Edge
{
int to,next,flow;
}edge1[Max<<],edge2[Max<<],edge[Max<<]; int T, n, m, s, t;
int head1[Max2],tot1;
int head2[Max2],tot2;
int dis_s[Max2],dis_t[Max2]; //某结点距离源点和始点的最近距离
bool vis[Max2];
int head[Max2],tot;
int dis[Max]; void init()
{
memset(head1,-,sizeof(head1));tot1 = ;
memset(head2,-,sizeof(head2));tot2 = ;
memset(head,-,sizeof(head));tot = ;
memset(dis_s,inf,sizeof(dis_s));
memset(dis_t,inf,sizeof(dis_t));
} void add1(int u, int v,int dist) //原图的边
{
edge1[tot1].to = v;
edge1[tot1].flow = dist;
edge1[tot1].next = head1[u];
head1[u] = tot1++; edge2[tot2].to = u;
edge2[tot2].flow = dist;
edge2[tot2].next = head2[v];
head2[v] = tot2++;
} void add2(int u,int v,int flow) //跑最大流的图
{
edge[tot].to = v;
edge[tot].flow = flow;
edge[tot].next = head[u];
head[u] = tot++;
} void dfs_s()
{
priority_queue<pair<int,int> > q;
memset(vis,,sizeof(vis)); q.push(make_pair(,s));
dis_s[s] = ; while(!q.empty())
{
int u = q.top().second;q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int i = head1[u] ;i != -;i = edge1[i].next)
{
int v = edge1[i].to;
if(!vis[v] && dis_s[v] > dis_s[u] + edge1[i].flow) //这里的flow就是边权,和网络流的图公用一个结构体
{
dis_s[v] = dis_s[u] + edge1[i].flow;
q.push(make_pair(-dis_s[v],v));
}
}
}
} void dfs_t()
{
priority_queue<pair<int,int> > q;
memset(vis,,sizeof(vis)); q.push(make_pair(,t));
dis_t[t] = ; while(!q.empty())
{
int u = q.top().second;q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int i = head2[u] ;i != -;i = edge2[i].next)
{
int v = edge2[i].to;
if(!vis[v] && dis_t[v] > dis_t[u] + edge2[i].flow) //这里的flow就是边权,和网络流的图公用一个结构体
{
dis_t[v] = dis_t[u] + edge2[i].flow;
q.push(make_pair(-dis_t[v],v));
}
}
}
} bool bfs()
{
memset(dis,-,sizeof(dis));
queue<int>q;
q.push(s);dis[s] = ;
while(!q.empty())
{
int u = q.front();q.pop();
for(int i = head[u]; i != - ; i = edge[i].next)
{
int v = edge[i].to;
if(edge[i].flow > && dis[v] == -)
{
dis[v] = dis[u] + ;
if(v == t) return true;
q.push(v);
}
}
}
return false;
} int dfs(int u, int flow_in)
{
if(u == t) return flow_in;
int flow_out = ;
for(int i = head[u] ; i != -; i = edge[i].next)
{
int v= edge[i].to;
if(edge[i].flow > && dis[v] == dis[u] + )
{
int flow = dfs(v,min(flow_in,edge[i].flow));
if(flow == ) continue;
flow_in -= flow;
flow_out += flow;
edge[i].flow -= flow;
edge[i^].flow += flow;
if(flow_in == ) break;
}
}
return flow_out;
} int Dinic()
{
int sum = ;
while(bfs())
{
sum += dfs(s,inf);
}
return sum;
} int main()
{
#ifdef LOCAL
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i = , u, v, dis;i <= m; i ++)
{
scanf("%d%d%d",&u,&v,&dis);
if(u != v)
add1(u,v,dis);
}
scanf("%d%d",&s,&t);
dfs_s();
dfs_t(); for(int u = ;u <= n ;u ++)
{
for(int i =head1[u]; i != -; i =edge1[i].next)
{
int v = edge1[i].to;
int flow = edge1[i].flow;
if(dis_s[u] + dis_t[v] + flow == dis_s[t]) //这条边为最短路上的边
{
add2(u,v,);add2(v,u,);
}
}
}
printf("%d\n",Dinic());
}
return ;
}

HDU 3416 Marriage Match IV (最短路建图+最大流)的更多相关文章

  1. hdu 3416 Marriage Match IV (最短路+最大流)

    hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...

  2. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  3. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  4. HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】

    <题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...

  5. hdu 3416 Marriage Match IV 【 最短路 最大流 】

    求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...

  6. HDU 3416 Marriage Match IV(ISAP+最短路)题解

    题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[ ...

  7. HDU 3416 Marriage Match IV(最短路,网络流)

    题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...

  8. HDU 3416 Marriage Match IV (Dijkstra+最大流)

    题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的S-->T的最短路有多少条. 分析:首先第一步需要找出所有可能最短路上的边.怎么高效地求出呢?可以这样:先对起点S,跑出最短路: ...

  9. HDU 3416 Marriage Match IV (最短路径&&最大流)

    /*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...

随机推荐

  1. Android中关于回调概念的笔记

    一.回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调 ...

  2. White Sheet

    C - White Sheet 思路:先看代码,分成了四个条件.第一个和第二个表示的都是当白矩形存在某个黑矩形内部的情况. 另外就是:白矩形位于两个黑矩形的并集区域. 即可分为两种情况,一种是白矩形位 ...

  3. cocos2dx热更新之后,闪退问题记录。

    如果使用cocos2dx的3.17.2版本的官方热更新. 然后有玩家反馈说热更新之后游戏闪退,游戏内有部分资源没更到. 考虑如下几个方面调整. 1,在文件下载失败的时候,直接调用重新下载. 2,把下载 ...

  4. mongoRepository 支持的所有接口

    与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用Repository的功能,先继承MongoReposito ...

  5. LeetCode 90. 子集 II(Subsets II)

    题目描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2 ...

  6. Struts2类数据封装

  7. Ceph 的用户管理与认证

    目录 文章目录 目录 前言 Ceph 的用户管理 用户管理常规操作 CephX 认证系统 身份认证原理 使用 ceph-authtool 进行密钥环管理 注意事项 前言 常规的身份认证系统无非三点: ...

  8. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_2 响应之返回值是String类型

    返回字符串 新建一个response的页面 新建后台Controller类 视图解析器配置的前缀地址 是WEB-INF下的pages下的页面. 创建pages文件夹在下面创建success.jsp页面 ...

  9. golang实现四种排序(快速,冒泡,插入,选择)

    本文系转载 原文地址: http://www.limerence2017.com/2019/06/29/golang07/ 前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种 ...

  10. asp.netMVC中配置automap

    第一.新建类库,以解决方案名XXX为例,建立子类库名为  XXX.AutoMapper. 第二. XXX.AutoMapper类库中,添加对automap的引用. 第三.创建映射文件类 ModelPr ...