HDU 3416 Marriage Match IV (最短路建图+最大流)
题目分析
题意:给出一个有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 (最短路建图+最大流)的更多相关文章
- hdu 3416 Marriage Match IV (最短路+最大流)
hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- HDU 3416 Marriage Match IV (求最短路的条数,最大流)
Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...
- HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】
<题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...
- hdu 3416 Marriage Match IV 【 最短路 最大流 】
求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...
- HDU 3416 Marriage Match IV(ISAP+最短路)题解
题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[ ...
- HDU 3416 Marriage Match IV(最短路,网络流)
题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...
- HDU 3416 Marriage Match IV (Dijkstra+最大流)
题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的S-->T的最短路有多少条. 分析:首先第一步需要找出所有可能最短路上的边.怎么高效地求出呢?可以这样:先对起点S,跑出最短路: ...
- HDU 3416 Marriage Match IV (最短路径&&最大流)
/*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...
随机推荐
- 灰度图像--图像分割 Marr-Hildreth算子(LoG算子)
学习DIP第49天 转载请标明本文出处:*http://blog.csdn.net/tonyshengtan *,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发: https:/ ...
- Cortex-M3 入门指南(三):时钟总线与复位时钟控制器
[reset clock control 复位和时钟控制器] 时钟信号对于处理器非常重要,比如我们熟悉的 CPU 就是由时钟信号驱动的,而主频就是内核的的时钟信号频率.Cortex-M3 有着复杂的 ...
- Paint the Digits
C - Paint the Digits 思路:这道题就只需要利用单调栈,将整个数组扫一遍,求得的最后的栈内元素(要求全部小于非栈内元素)的颜色为1,其余为2 那么怎么实现呢?求最后的栈内元素(要求全 ...
- CodeForces 707D Persistent Bookcase ——(巧妙的dfs)
一个n*m的矩阵,有四种操作: 1.(i,j)处变1: 2.(i,j)处变0: 3.第i行的所有位置1,0反转: 4.回到第k次操作以后的状态: 问每次操作以后整个矩阵里面有多少个1. 其实不好处理的 ...
- PHP-windows下安装
下载 Apache下载地址:http://httpd.apache.org/download.cgi PHP下载地址:http://php.net/downloads.php 解压 解压到安装路径下H ...
- Java中的多线程技术全面详解
本文主要从整体上介绍Java中的多线程技术,对于一些重要的基础概念会进行相对详细的介绍,若有叙述不清晰或是不正确的地方,希望大家指出,谢谢大家:) 为什么使用多线程 并发与并行 我们知道,在单核机器上 ...
- TCP时间戳选项Timestamp
时间戳选项发送方在每个报文段中放置一个时间戳值.接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT(我们必须说“每一个收到的ACK”而不是“每一个收到的报文段”,是因为TCP通常 ...
- 8 Linux 文件类型
Linux 系统中的文件是没有扩展名的. 1.通过 ls -l 文件名,看第一个字符判断文件类型: - 普通文件(文本文件.二进制文件.压缩文件.电影.图片等) d 目录文件 b 设备文件(块设 ...
- Mui 底部导航切换
1.建好子模板目录 2.导航代码 <nav class="mui-bar mui-bar-tab"> <a id="defaultTab" c ...
- Maven私服搭建及使用-Windows版
了解有限,目前只针对基础功能介绍,持续更新 一.下载对应的版本(本例版本:nexus-3.7.1-02) https://www.sonatype.com/download-oss-sonatype ...