题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路

一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦。

首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是最短路上的边,将这个边加入网络流的建图中,流量定为1表示这条边只能用一次,这样跑一遍最大流就能直接解决问题了。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<vector>
  6. using namespace std;
  7. typedef pair<int,int> pii;
  8. const int maxm=;
  9. const int INF=0x3f3f3f3f;
  10.  
  11. struct cmp{
  12. bool operator()(pii a,pii b){
  13. return a.first>b.first;
  14. }
  15. };
  16.  
  17. int head[],point[],val[],nxt[],size;
  18. bool vis[];
  19. int dis[],n,s,p,fa[],pa[];
  20.  
  21. struct edge{ //弧的结构体,变量:弧的出发点、结束点、容量、流量
  22. int from,to,c,f;
  23. edge(int a,int b,int m,int n):from(a),to(b),c(m),f(n){}
  24. };
  25.  
  26. struct dinic{
  27. int m,s,t; //边数、源点标号、汇点标号
  28. vector<edge>e; //边
  29. vector<int>g[maxm]; //g[i][j]表示第i个点出发的第j条边在e中的编号
  30. bool vis[maxm];
  31. int d[maxm],cur[maxm]; //d为源点到点的距离,cur为当前遍历到的边
  32. void init(int n){ //初始化,n为点数量(标号0~n-1)
  33. for(int i=;i<n+;i++)g[i].clear();
  34. e.clear();
  35. }
  36. void add(int a,int b,int v){ //加入弧和反向弧
  37. e.push_back(edge(a,b,v,)); //正向弧容量v,反向弧容量0
  38. e.push_back(edge(b,a,,));
  39. m=e.size();
  40. g[a].push_back(m-);
  41. g[b].push_back(m-);
  42. }
  43. bool bfs(){
  44. memset(vis,,sizeof(vis));
  45. queue<int>q;
  46. q.push(s);
  47. d[s]=;
  48. vis[s]=;
  49. while(!q.empty()){
  50. int u=q.front();q.pop();
  51. for(int i=;i<g[u].size();i++){
  52. edge tmp=e[g[u][i]];
  53. if(!vis[tmp.to]&&tmp.c>tmp.f){
  54. vis[tmp.to]=;
  55. d[tmp.to]=d[u]+;
  56. q.push(tmp.to);
  57. }
  58. }
  59. }
  60. return vis[t];
  61. }
  62. int dfs(int x,int a){
  63. if(x==t||a==)return a;
  64. int flow=,f;
  65. for(int& i=cur[x];i<g[x].size();i++){
  66. edge &tmp=e[g[x][i]];
  67. if(d[x]+==d[tmp.to]&&(f=dfs(tmp.to,min(a,tmp.c-tmp.f)))>){
  68. tmp.f+=f;
  69. e[g[x][i]^].f-=f;
  70. flow+=f;
  71. a-=f;
  72. if(a==)break;
  73. }
  74. }
  75. if(!flow)d[x]=-;
  76. return flow;
  77. }
  78. int mf(int s,int t){ //在主函数中使用的函数,求s到t的最大流
  79. this->s=s;
  80. this->t=t;
  81. int flow=;
  82. while(bfs()){
  83. memset(cur,,sizeof(cur));
  84. flow+=dfs(s,INF);
  85. }
  86. return flow;
  87. }
  88. };
  89.  
  90. void add(int a,int b,int v){
  91. point[size]=b;
  92. val[size]=v;
  93. nxt[size]=head[a];
  94. head[a]=size++;
  95. }
  96.  
  97. void dij(){
  98. int i;
  99. priority_queue<pii,vector<pii>,cmp>q;
  100. memset(dis,0x3f,sizeof(dis));
  101. memset(fa,-,sizeof(fa));
  102. dis[s]=;
  103. q.push(make_pair(dis[s],s));
  104. while(!q.empty()){
  105. pii u=q.top();
  106. q.pop();
  107. if(u.first>dis[u.second])continue;
  108. for(i=head[u.second];~i;i=nxt[i]){
  109. int j=point[i],v=u.first+val[i];
  110. if(!vis[i]&&dis[j]>v){
  111. dis[j]=v;
  112. fa[j]=u.second;
  113. pa[j]=i;
  114. q.push(make_pair(dis[j],j));
  115. }
  116. }
  117. }
  118. }
  119.  
  120. int main(){
  121. int t;
  122. scanf("%d",&t);
  123. for(int q=;q<=t;q++){
  124. int m,i;
  125. memset(head,-,sizeof(head));
  126. memset(vis,,sizeof(vis));
  127. size=;
  128. scanf("%d%d",&n,&m);
  129. for(i=;i<=m;i++){
  130. int a,b,v;
  131. scanf("%d%d%d",&a,&b,&v);
  132. if(a!=b){
  133. add(a,b,v);
  134. }
  135. }
  136. scanf("%d%d",&s,&p);
  137. dinic d;
  138. dij();
  139. for(i=;i<=n;++i){
  140. for(int j=head[i];~j;j=nxt[j]){
  141. int k=point[j];
  142. if(dis[i]+val[j]==dis[k])d.add(i,k,);
  143. }
  144. }
  145. printf("%d\n",d.mf(s,p));
  146. }
  147. return ;
  148. }

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

  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+hdu6582(最短路+最大流)

    题意 hdu3416: 给一个图,边不能重复选,问有多少个最短路 hdu6582: 给一个图,问最少删除边权多少的边后,最短路长度增加 分析 边不能重复选这个条件可以想到边权为1,跑最大流,所以我们可 ...

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

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

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

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

  9. 【BZOJ-3931】网络吞吐量 最短路 + 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1228  Solved: 524[Submit][Stat ...

随机推荐

  1. JS 数组去重!!!

    var arr = [1,2,3,1,1,1,3,5,3,6,2]; var newArr=[]; for(var i = 0; i < arr.length-1; i++){ var onOf ...

  2. Linux下tmpfs与ramfs的区别

      ramfs是Linux下一种基于RAM做存储的文件系统.在使用过程中你就可以把ramfs理解为在普通的HDD上建立了一个文件系统,而现在HDD被替换成了RAM,因为是RAM做存储所以会有很高的存储 ...

  3. js面向对象(构造函数与继承)

    深入解读JavaScript面向对象编程实践 Mar 9, 2016 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化.多态.和封装几种技术. 对JavaScript而言,其 ...

  4. (转)面向移动设备的HTML5开发框架

    (原)http://www.cnblogs.com/itech/archive/2013/07/27/3220352.html 面向移动设备的HTML5开发框架   转自:http://blogrea ...

  5. android-volley-at-a-glance

    http://liubin.org/2013/05/27/android-volley-at-a-glance/ http://www.androidhive.info/2014/05/android ...

  6. 2016-1-15 抽屉效果实现demo

    // // ViewController.m // 抽屉 // // Created by Mac on 16/1/15. // Copyright © 2016年 Mac. All rights r ...

  7. Objective-C determine data network type of the iOS device

    Im on an application that receive data from server, the problem is when user connect to cellular dat ...

  8. 解决关于打开plist文件乱码问题,plist转换为xml文件的txt文件!

    自己是程序员,干嘛不自己写代码完成?下载工具还不一定管用!具体解决方案如下: 1,获得内容 NSArray *dictionary = [NSArray arrayWithContentsOfFile ...

  9. 第一个Sprint冲刺第七天

    讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:怎样添加功能 讨论地点:宿舍 遇到问题:编写代码的思路不完整,很混乱 工作进度: 队员工作照:

  10. 动画(Animation) 、 高级动画(Core Animation)

    1 演示UIImage制作的动画 1.1 问题 UIImage动画是IOS提供的最基本的动画,通常用于制作一些小型的动画,本案例使用UIImage制作一个小狗跑动的动画,如图-1所示: 图-1 1.2 ...