题意

hdu3416:

给一个图,边不能重复选,问有多少个最短路

hdu6582:

给一个图,问最少删除边权多少的边后,最短路长度增加

分析

边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可以先跑出最短路,再把最短路中的边作为网络流中的边跑一遍最大流即可。

最短路长度增加即最短路这个子图不再联通,要使一个图不再联通的最小代价显然就是最小割,也等于最大流。

找出最短路中的边的方法是从s正着跑一遍最短路,再从t逆着跑一遍最短路,如果\(low[u]+rev[v]+w==low[t]\),则\((u,v)\)为最短路中的边。

代码(hdu6582)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e4+50;
  5. const ll INF=1e18;
  6. int T,n,m;
  7. int uu[N],vv[N];
  8. ll ww[N];
  9. vector<pair<int,int> > g[N];
  10. ll low[N],rev[N];
  11. bool vis[N];
  12. struct node{
  13. int v;
  14. ll c;
  15. bool operator<(const node &rhs)const{
  16. return c>rhs.c;
  17. }
  18. };
  19. void dijkstra(int s,ll low[]){
  20. for(int i=1;i<=n;i++){
  21. low[i]=INF;
  22. vis[i]=false;
  23. }
  24. low[s]=0;
  25. priority_queue<node> pq;
  26. pq.push(node{s,low[s]});
  27. while(!pq.empty()){
  28. node tmp=pq.top();
  29. pq.pop();
  30. int u=tmp.v;
  31. if(vis[u]){
  32. continue;
  33. }
  34. vis[u]=true;
  35. int siz=g[u].size();
  36. for(int i=0;i<siz;i++){
  37. int v=g[u][i].first;
  38. ll w=g[u][i].second;
  39. if(!vis[v] && low[v]>low[u]+w){
  40. low[v]=low[u]+w;
  41. pq.push(node{v,low[v]});
  42. }
  43. }
  44. }
  45. }
  46. struct Edge{
  47. int v,w,next;
  48. }edge[N*2];
  49. int cnt,head[N];
  50. void init(){
  51. cnt=0;
  52. memset(head,-1,sizeof(head));
  53. }
  54. void add(int u,int v,int w){
  55. edge[cnt]=Edge{v,w,head[u]};
  56. head[u]=cnt++;
  57. edge[cnt]=Edge{u,0,head[v]};
  58. head[v]=cnt++;
  59. }
  60. int dep[N];
  61. bool bfs(){
  62. memset(dep,0,sizeof(dep));
  63. dep[1]=1;
  64. queue<int> q;
  65. q.push(1);
  66. while(!q.empty()){
  67. int u=q.front();
  68. q.pop();
  69. for(int i=head[u];i!=-1;i=edge[i].next){
  70. int v=edge[i].v;
  71. ll w=edge[i].w;
  72. if(w>0 && dep[v]==0){
  73. dep[v]=dep[u]+1;
  74. q.push(v);
  75. }
  76. }
  77. }
  78. return dep[n]!=0;
  79. }
  80. int cur[N];
  81. ll dfs(int u,ll flow){
  82. if(u==n){
  83. return flow;
  84. }
  85. for(int &i=cur[u];i!=-1;i=edge[i].next){
  86. int v=edge[i].v;
  87. ll w=edge[i].w;
  88. if(dep[v]==dep[u]+1 && w>0){
  89. int dis=dfs(v,min(w,flow));
  90. if(dis>0){
  91. edge[i].w-=dis;
  92. edge[i^1].w+=dis;
  93. return dis;
  94. }
  95. }
  96. }
  97. return 0;
  98. }
  99. ll dinic(){
  100. ll ans=0;
  101. while(bfs()){
  102. for(int i=1;i<=n;i++){
  103. cur[i]=head[i];
  104. }
  105. while(ll d=dfs(1,INF)){
  106. ans+=d;
  107. }
  108. }
  109. return ans;
  110. }
  111. int main(void){
  112. // freopen("in.txt","r",stdin);
  113. scanf("%d",&T);
  114. while(T--){
  115. scanf("%d%d",&n,&m);
  116. for(int i=1;i<=n;i++){
  117. g[i].clear();
  118. }
  119. for(int i=0;i<m;i++){
  120. scanf("%d%d%lld",&uu[i],&vv[i],&ww[i]);
  121. g[uu[i]].push_back({vv[i],ww[i]});
  122. }
  123. dijkstra(1,low);
  124. for(int i=1;i<=n;i++){
  125. g[i].clear();
  126. }
  127. for(int i=0;i<m;i++){
  128. g[vv[i]].push_back({uu[i],ww[i]});
  129. }
  130. dijkstra(n,rev);
  131. init();
  132. for(int i=0;i<m;i++){
  133. if(uu[i]!=vv[i] && low[uu[i]]+rev[vv[i]]+ww[i]==low[n]){
  134. add(uu[i],vv[i],ww[i]);
  135. }
  136. }
  137. ll ans=dinic();
  138. printf("%lld\n",ans);
  139. }
  140. return 0;
  141. }

hdu3416+hdu6582(最短路+最大流)的更多相关文章

  1. hdu5294||2015多校联合第一场1007 最短路+最大流

    http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...

  2. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  3. 【最短路+最大流】上学路线@安徽OI2006

    目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ...

  4. P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)

    第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ...

  5. HDU-3416 Marriage Match IV 最短路+最大流 找各最短路的所有边

    题目链接:https://cn.vjudge.net/problem/HDU-3416 题意 给一个图,求AB间最短路的条数(每一条最短路没有重边.可有重复节点) 思路 首先把全部最短路的边找出来,再 ...

  6. hdu3416 最短路+最大流

    题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就 ...

  7. hdu3416 Marriage Match IV【最短路+最大流】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297581.html   ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...

  8. hdu3416 Marriage Match IV 最短路+ 最大流

    此题的大意:给定一幅有向图,求起点到终点(都是固定的)的不同的最短路有多少条.不同的最短路是说不能有相同的边,顶点可以重复.并且图含有平行边. 看了题以后,就想到暴力,但是暴力往往是不可取的.(暴力的 ...

  9. hdu3416 判断最短路是否唯一(每条边只能走一次)

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. 由TreeView 如何触发OnSelectedNodeChanged事件想到的与做到的

    前提是每层的结点上设置了NavigateUrl OnSelectedNodeChanged事件好像失去了作用. 另外TreeView是没有AutoPostBack的!!!! 那么要如何触发OnSele ...

  2. 使用Arcgis Api for Javascript 调用 本地Portal发布的WebMap

    1.环境搭建 安装Arcgis Portal 10.4,Server 10.4,DataStore ,WebAdaptor for IIS,搭建arcgis api for javascript 4. ...

  3. 第二章 在Linux上部署.net core

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  4. 简单了解HashCode()

    在java的内部类中,计算HashCode通常使用 code = 元素* 31 + 下一个元素 以String为例 public int hashCode() { int h = hash; if ( ...

  5. 关于学习js的Promise的心得体会

    最近一直在研究js的Promise对象,其中有一篇blog写得比较通俗易懂,转发如下: http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 参照上面 ...

  6. KNN算法——分类部分

    1.核心思想 如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.也就是说找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该 ...

  7. 前后端开发(2):浏览器与PHP程序的交互

    上一节介绍怎么在mac电脑上启用PHP程序,并且演示了一个简单的例子,这个例子运行时,涉及了浏览器.apache以及PHP程序的交互,这三者的关系大概是这样的: 一般来说,浏览器(或者类似功能的程序) ...

  8. spring源码深度解析— IOC 之 容器的基本实现

    概述 上一篇我们搭建完Spring源码阅读环境,spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spr ...

  9. 惊:FastThreadLocal吞吐量居然是ThreadLocal的3倍!!!

    说明 接着上次手撕面试题ThreadLocal!!!面试官一听,哎呦不错哦!本文将继续上文的话题,来聊聊FastThreadLocal,目前关于FastThreadLocal的很多文章都有点老有点过时 ...

  10. css之vw布局

    vw,vh是视口单位,是相对视口单位,与百分百布局不一样的是,百分百是相对于父及元素,而vw布局是相对与窗口. 而rem布局是要与js一起配合 // 以iphone6设计稿 @function px2 ...