题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条。

解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短路的题目接触过很多,反向建一个图,求两边最短路,即从src到任一点的最短路dis1[]和从des到任一点的最短路dis2[],那么假设这条边是(u,v,w),如果dis1[u] + w + dis2[v] = dis1[des],说明这条边是构成最短路的边。找到这些边,就可以把边的容量设为1,跑一边最大流即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;const int maxn = 1005;
const int inf = 0x3f3f3f3f;
struct Edge
{int from,to,next,w;
}edge[800005],E[100005];
int n,m,st,ed;
int cnt,head[maxn],pre[2][maxn];
int dis[2][maxn],level[maxn];
bool inq[maxn];void addedge(int u,int v,int w)
{edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt++;swap(u,v);edge[cnt].to = v;edge[cnt].w = 0;edge[cnt].next = head[u];head[u] = cnt++;
}void addedge1(int u,int v,int w)
{edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = pre[0][u];pre[0][u] = cnt++;
}void addedge2(int u,int v,int w)
{edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = pre[1][u];pre[1][u] = cnt++;
}void build()
{int u,v,w;memset(head,-1,sizeof(head));for(int i = 1; i <= m; i++){u = E[i].from, v = E[i].to, w = E[i].w;if(dis[0][u] + w + dis[1][v] == dis[0][ed])addedge(u,v,1);}
}void spfa(int src,int des,int idx)
{queue<int> q;memset(dis[idx],inf,sizeof(dis[idx]));memset(inq,false,sizeof(inq));dis[idx][src] = 0;q.push(src);inq[src] = true;while(!q.empty()){int u = q.front();q.pop();inq[u] = false;for(int i = pre[idx][u]; i != -1; i = edge[i].next){int v = edge[i].to;if(dis[idx][v] > dis[idx][u] + edge[i].w){dis[idx][v] = dis[idx][u] + edge[i].w;if(inq[v] == false){inq[v] = true;q.push(v);}}}}
}int BFS(int src,int des){queue<int> q;memset(level,0,sizeof(level));level[src]=1;q.push(src);while(!q.empty()){int u = q.front();q.pop();if(u==des) return 1;for(int k = head[u];k!=-1;k=edge[k].next){int v = edge[k].to,w=edge[k].w;if(level[v]==0 && w!=0){level[v]=level[u]+1;q.push(v);}}}return -1;
}
int dfs(int u,int des,int increaseRoad){if(u==des) return increaseRoad;int ret=0;for(int k=head[u];k!=-1;k=edge[k].next){int v = edge[k].to,w=edge[k].w;if(level[v]==level[u]+1&&w!=0){int MIN = min(increaseRoad-ret,w);w = dfs(v,des,MIN);if(w > 0){edge[k].w -=w;edge[k^1].w+=w;ret+=w;if(ret==increaseRoad) return ret;}else level[v] = -1; }}return ret;
}
int Dinic(int src,int des){int ans = 0;while(BFS(src,des)!=-1) ans+=dfs(src,des,inf);return ans;
}int main()
{int t,u,v,w;scanf("%d",&t);while(t--){cnt = 0;memset(pre,-1,sizeof(pre));scanf("%d%d",&n,&m);for(int i = 1; i <= m; i++){scanf("%d%d%d",&u,&v,&w);E[i].from = u,E[i].to = v,E[i].w = w;addedge1(u,v,w);addedge2(v,u,w);}scanf("%d%d",&st,&ed);spfa(st,ed,0);spfa(ed,st,1);build();int maxflow = Dinic(st,ed);printf("%d\n",maxflow);}return 0;
}

hdu 3416(最短路+最大流)相关推荐

  1. HDU 3416 Marriage Match IV

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

  2. HDU - 3416 Marriage Match IV(最大流+最短路)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...

  3. hdu 2448 Mining Station on the Sea(最短路+费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2448 题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个 ...

  4. HDU 5294 Tricks Device(最短路+最大流)

    题意:给一个无向图(连通的),张在第n个点,吴在第1个点,'吴'只能通过最短路才能到达'张',两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:将所有 ...

  5. POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  6. HDU - 6582 Path(最短路+最大流)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的有向图,现在问让最短路变长的最小花费是多少 题目分析:增加最短路的最小花费,我们可以将最短路上的边单独拿出来,再求一下最小割就好了,用 ...

  7. Tricks Device 最短路+最大流

    http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1006&ojid=0&cid=12578&hide= ...

  8. 【HDU】4411 Arrest 费用流

    传送门:[HDU]4411 Arrest 题目分析:题目的意思一开始没看懂= =...题意大致为:派出至多K个警队遵守先灭小的再灭老的的原则将N个城市的帮派全端了(要灭编号大的必须要先灭编号小的).且 ...

  9. HDU 4411 Arrest(费用流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4411 题意:有n+1个城市,编号0到n.其中警察局在0号城市,1到n号城市中每个城市都有一个小偷.现在 ...

最新文章

  1. 安装asp.net mvc4后mvc3项目编译报错
  2. AI 学习之路——轻松初探 Python 篇(三)
  3. sqlite 统计每张表的记录数_Excel单页式人事管理表,档案记录,自带查询统计,简单实用...
  4. pythoni手机版下载_Python进度栏和下载
  5. talentcentral测评结果_WinTalent人才测评系统
  6. c++友元模板单例模式
  7. SQL 中为什么经常要加NOLOCK?
  8. 还在低效搬砖?看 BIM 如何颠覆了土木工程?
  9. Mac 删除不必要的 Adobe PS AI 组件
  10. 基于SSM实现宠物领养网站平台管理系统
  11. 快手短视频去水印方法
  12. 申请苹果个人开发者经历
  13. 数模转换DAC-TLC5615的说明
  14. 双线macd指标参数最佳设置_一文讲透双线MACD指标及其实战运用
  15. 未来的计算机 展望未来作文,展望未来作文(通用10篇)
  16. 64位 Eclipse IDE for Java EE Developers 下载地址
  17. 如何配置域名的 CNAME
  18. 实现登录和用户信息组件的按需展示
  19. 如何使用SPSS Amos进行验证性因子分析(CFA)和Bootstrap检验中介效应
  20. 《OSPF和IS-IS详解》一1.1 星际网络

热门文章

  1. 福州大学java期末试卷2012_福州大学 07Java语言程序设计试卷(A卷).doc
  2. 科普|数据治理如何在 Martech 中发挥效能?
  3. 百果园付凌峰:线上单月 1.2 亿背后的数据化运营
  4. 前端工程师必须知道的vue前端面试题目汇总
  5. 掌握这些PPT技巧,让你的工作效率提高10倍
  6. Java GUI:将JPanel添加进JScrollPane
  7. 基于Object.defineProperty实现双向数据绑定
  8. 配置 VIM 英语字典
  9. 复杂多边形光栅化算法
  10. rpmbuile 制作drbd RPM包