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 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...
随机推荐
- centos调整屏幕亮度
笔记本安装centos6.5后亮度无法通过键盘快捷键调节,可以通过安装软件来调节. 安装:yum install xgamma 设置亮度:xgamma -gamma n( 0.1 < n < ...
- IDEA怎么开启终端Terminal
方法一:在IDEA中点击view→tool window→Terminal即可开启 方法二:按住ALT+F12(如果是笔记本按不出来的话再加个Fn键)
- hive 源码笔记(1):命令行执行的主流程。
1. 'hive'命令是(默认为hive跟目录)./bin下的一个shell脚本,依次加载 ./bin/hive-config.sh, ./conf/hive-env.sh, 设置与hadoop.sp ...
- 【原】vue-router中params和query的区别
1.引入方式不同 query要用path来引入 this.$router.push({ path: 'test', query: { type: 2, detail: '哈哈' } }) params ...
- MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》
最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...
- 软件-效率:Microsoft To Do
ylbtech-软件-效率:Microsoft To Do Microsoft To Do To Do 让你从工作到娱乐都保持专注. 1.返回顶部 1. 智能每日计划 使用“我的一天”,用智能个性化建 ...
- js图片轮播效果实现代码
首先给大家看一看js图片轮播效果,如下图 具体思路: 一.页面加载.获取整个容器.所有放数字索引的li及放图片列表的ul.定义放定时器的变量.存放当前索引的变量index 二.添加定时器,每隔2秒钟i ...
- springboot2.0---控制台打印Mybatis的SQL记录
题记:每次使用mybatis出错,都不知道sql原因,debug也不出结果,索性将其打印出来,更加容易排错. 亲测有效,只需要将下面的logback.xml放置在resource目录下即可打印. 方式 ...
- MySQL如何查询某个字段长度最大的记录
转: MySQL如何查询某个字段长度最大的记录 2017年06月24日 13:12:15 翔云123456 阅读数 18348 版权声明:本文为翔云原创文章,未经博主允许不得转载. https:/ ...
- 远程发送文件失败(scp)
出现这种情况的原因是之前保存过192.168.210.134的密钥. 碰到这种情况进行如下操作: ①查看隐藏文件 [root@localhost ~]# ls -a .ssh ②切换到 .ssh ...