题目链接:https://cn.vjudge.net/problem/HDU-3416

题意

给一个图,求AB间最短路的条数(每一条最短路没有重边。可有重复节点)

思路

首先把全部最短路的边找出来,再来一遍最大流

所以如何找到全部最短路的边就是一个问题了

首先求从A到B的各节点最短路,再求B到A的最短路(注意把边反向)

便利所有边,如果满足distA[from]+distB[to]+dist==distA[B],那么这个边{from, to, dist}就是最短路中的一个边

然后最大流即可

提交过程

TLE1 纯属胡写,给了最小费用最大流的代码
TLE2 胡写2,给代码加了个判断,总是求最短路的最大流
TLE3 思路正确,然而超时,应该是EdmondsKarp超时
TLE4 Bellman栈优化,超时原因同上
TLE5 EdmondsKarp换SAP,超时原因可能是maxn和maxm给少了
TLE6 怀疑Bellman栈优化有问题,换回队列
MLE7 maxn和maxm给多了
AC maxn和maxm按原题乘以2
TLE7 怀疑EdmondsKarp超时,于是试了试,果然如此

代码

#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=2e3+10, maxm=2e5+10, INF=0x3f3f3f3f;
struct Edge{
int to, dis, next;
Edge(int to=0, int dis=0, int next=0):
to(to), dis(dis), next(next) {}
}edges[maxm+5];
struct FlowEdge{
int from, to, cap, flow, next;
FlowEdge(int from=0, int to=0, int cap=0, int next=0):
from(from), to(to), cap(cap), next(next) {}
}fedges[maxm+5];
int head[maxn+5], fhead[maxn+5], esize, fsize, dis[2][maxn+5]; void init(void){
memset(head, -1, sizeof(head));
esize=0;
} void addEdge(int from, int to, int dis){
edges[esize]=Edge(to, dis, head[from]);
head[from]=esize++;
} bool Bellman(int st, int n, int which){
bool inq[maxn+5]={false};
int cnt[maxn+5]={0}, dist[maxn+5];
queue<int> que; // stack<int> sta;
memset(dist, INF, sizeof(dist));
dist[st]=0; inq[st]=true; cnt[st]=1; que.push(st); // sta.push(st);
while (que.size()){
int from=que.front(); que.pop();
inq[from]=false; for (int i=head[from]; i!=-1; i=edges[i].next){
Edge &e=edges[i];
int &to=e.to; if (dist[to]<=dist[from]+e.dis) continue;
dist[to]=dist[from]+e.dis; if (inq[to]) continue;
inq[to]=true; que.push(to); if (++cnt[to]>n) return false;
}
}
memcpy(dis[which], dist, sizeof(dist));
return true;
} void finit(void){
memset(fhead, -1, sizeof(fhead));
fsize=0;
} void addFlowEdge(int from, int to, int cap){
fedges[fsize]=FlowEdge(from, to, cap, fhead[from]);
fhead[from]=fsize++;
fedges[fsize]=FlowEdge(to, from, 0, fhead[to]);
fhead[to]=fsize++;
} int d[maxn+5], pre[maxn+5], gap[maxn+5], cur[maxn+5];
int sap(int start,int end,int nodenum){
memset(d,0,sizeof(d));
memset(gap,0,sizeof(gap));
memcpy(cur,fhead,sizeof(fhead));
int u=pre[start]=start,maxflow=0,aug=-1;
gap[0]=nodenum;
while(d[start]<nodenum){
loop:
for(int &i=cur[u];i!=-1;i=fedges[i].next){
int v=fedges[i].to;
if(fedges[i].cap&&d[u]==d[v]+1){
if(aug==-1||aug>fedges[i].cap)
aug=fedges[i].cap;
pre[v]=u;
u=v;
if(v==end){
maxflow+=aug;
for(u=pre[u];v!=start;v=u,u=pre[u]){
fedges[cur[u]].cap-=aug;
fedges[cur[u]^1].cap+=aug;
}
aug=-1;
}
goto loop;
}
} int mind=nodenum;
for(int i=fhead[u]; i!=-1; i=fedges[i].next){
int v=fedges[i].to;
if(fedges[i].cap && mind>d[v]){
cur[u]=i;
mind=d[v];
}
}
if((--gap[d[u]])==0) break;
gap[d[u]=mind+1]++;
u=pre[u];
}
return maxflow;
} int main(void){
int T, n, m;
int from[maxm+5], to[maxm+5], di[maxm+5], st, tar; scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
init();
for (int i=0; i<m; i++){
scanf("%d%d%d", &from[i], &to[i], &di[i]);
addEdge(from[i], to[i], di[i]);
}scanf("%d%d", &st, &tar);
Bellman(st, n, 0); init();
for (int i=0; i<m; i++)
addEdge(to[i], from[i], di[i]);
Bellman(tar, n, 1); finit();
for (int i=0; i<m; i++)
if (to[i]!=from[i] && dis[0][from[i]]+dis[1][to[i]]+di[i]==dis[0][tar])
addFlowEdge(from[i], to[i], 1);
printf("%d\n", sap(st, tar, n));
} return 0;
}
Time Memory Length Lang Submitted
140ms 10332kB 3727 G++ 2018-06-09 00:24:00

HDU-3416 Marriage Match IV 最短路+最大流 找各最短路的所有边的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. HDU 3416 Marriage Match IV dij+dinic

    题意:给你n个点,m条边的图(有向图,记住一定是有向图),给定起点和终点,问你从起点到终点有几条不同的最短路 分析:不同的最短路,即一条边也不能相同,然后刚开始我的想法是找到一条删一条,然后光荣TLE ...

  7. HDU 3416 Marriage Match IV

    最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

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

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

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

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

  10. HDU 3416 Marriage Match IV (最短路建图+最大流)

    (点击此处查看原题) 题目分析 题意:给出一个有n个结点,m条单向边的有向图,问从源点s到汇点t的不重合的最短路有多少条,所谓不重复,意思是任意两条最短路径都不共用一条边,而且任意两点之间的边只会用一 ...

随机推荐

  1. CSS背景使用,引入、尺寸、平铺、定位、多重背景

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  2. 51nod 237 最大公约数之和 V3 杜教筛

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...

  3. JAVA导出csv出现0.00E+00

    导出csv出现 0.00E+00的问题,打印其值为0E-8:这是因为数据表中无对应数据(decimal),查询结果则为 0e-8. 出现的字段是多个字段相加产生的和,所以这里调用了一个相加的方法.在相 ...

  4. underscore的简单了解

    1.underscore:一个封装好的js工具库,它提供了一整套函数式编程的使用功能,但是没有扩展任何js内置对象.它解决了这个问题:如果我面对一个空白的HTML,并希望立即开始工作,我需要什么? 2 ...

  5. JQ UI dialog

    初始化参数 对于 dialog 来说,首先需要进行初始化,在调用 dialog 函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框. 没有参数,表示按照默认的设置初始化对话 ...

  6. POJ 3122 Pie( 二分搜索 )

    链接:传送门 题意:一个小朋友开生日派对邀请了 F 个朋友,排队上有 N 个 底面半径为 ri ,高度为 1 的派,这 F 个朋友非常不友好,非得"平分"这些派,每个人都不想拿到若 ...

  7. sql server 与 mysql在自定以数据类型的区别

    sql server   中可以使用 create  TYPE postal_code FORM varchar(6) not null; 用于限定邮编的数据位数,他基于varchar数据类型 注意: ...

  8. CSVHelper读出乱码 解决方案

    using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) using (StreamRe ...

  9. .C#-NET开源方向基本

    我的理解,nancyFx是一个.net的微型框架,可以在Linux环境下运行,ServiceStack也是全平台框架,更大一些 owin的概念:Open Web Server Interface Fo ...

  10. (手冊)Animation 之 使用Animation View

    观看游戏物体上的动画(Viewing Animations on a GameObject) Animation View 是与 Hierarchy View.Scene View和Inspector ...