携程的一道图论题

题意:给出一张无向图 每条边有一个长度和 删除该边的权值  再给出起点和终点 求从起点到终点的最短路增加 要删除的边的最小的权值和。

【思路】要使 从起点到终点的最短路长度增加 就要把该最短路破坏掉  从起点到终点的最短路可能不止一条,我们可以把 这些路径都找出来 重新构成一个图

再求这个图的最小割 就是答案了    怎么把这些路径都找出来呢  求两次最短路 第一次求 所有点到起点的最短路d1[x]  第二次求所有点到终点的最短               路 d2[x]    从起点到终点的最短路为ans 。再遍历每一条边 对于d1[u]+d2[v]+w[u][v]== ans 的边就可以加入了~

还要改一点 先放这里

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<queue>
  6 #include<math.h>
  7 #include<algorithm>
  8 #include<vector>
  9 #define maxx 9999999
 10 using namespace std;
 11
 12 struct E{int from;int to;int c;int f;};
 13 struct node{int v;int w;int c;};
 14 vector <node> g1[1002];
 15 vector <int > g[1002];
 16 vector<E> edge;
 17 int vis[1002],d1[1002],d2[1002],n,a[1002],p[1002],num[1002],cur[1002],d[1002];
 18
 19 void add(int from,int to,int c)
 20  {
 21      E temp1,temp2;
 22      temp1.from =from; temp1.to=to; temp1.c=c;temp1.f=0;
 23      temp2.from =to; temp2.to=from; temp2.c=0;temp2.f=0;
 24      edge.push_back (temp1);
 25      edge.push_back (temp2);
 26      int m=edge.size ();
 27      g[from].push_back (m-2);
 28      g[to].push_back (m-1);
 29  }
 30
 31  void bfs(int s,int t)
 32  {
 33      int i;
 34      queue<int > q;
 35      q.push (t);
 36      d[t]=0;
 37      memset(vis,0,sizeof(vis));
 38      vis[t]=1;
 39      while(!q.empty ())
 40      {
 41          int t=q.front ();q.pop ();
 42          for(i=0;i<g[t].size ();i++)
 43          {
 44             E e;e=edge[g[t][i]];
 45             if(!vis[e.to])
 46             {
 47                 q.push (e.to);
 48                 vis[e.to]=1;
 49                 d[e.to]=d[t]+1;
 50             }
 51          }
 52      }
 53  }
 54
 55  int zg(int s,int t)
 56  {
 57      int x=t,a=maxx;
 58      while(x!=s)
 59      {
 60          //printf("x   %d\n",x);
 61          E e=edge[p[x]];
 62          if(a>e.c-e.f)
 63              a=e.c-e.f;
 64          x=e.from;
 65      }
 66      x=t;
 67      while(x!=s)
 68      {
 69          edge[p[x]].f+=a;
 70          edge[p[x]^1].f-=a;
 71          x=edge[p[x]].from ;
 72      }
 73      return a;
 74  }
 75
 76  int maxflow(int s,int t,int n)
 77  {
 78      int flow=0,i;
 79      bfs(s,t);
 80      memset(num,0,sizeof(num));
 81      memset(cur,0,sizeof(cur));
 82      for(i=0;i<=t;i++)
 83          num[d[i]]++;
 84      int x=s;
 85      while(d[s]<n)
 86      {
 87          if(x==t)
 88          {
 89              flow+=zg(s,t);
 90              x=s;
 91              printf("flow  %d\n",flow);
 92          }
 93          int ok=0;
 94          for(i=cur[x];i<g[x].size ();i++)
 95          {
 96              E e;
 97              e=edge[g[x][i]];
 98              if(e.c>e.f&&d[x]==d[e.to]+1)
 99              {
100                  ok=1;
101
102                  p[e.to]=g[x][i];
103
104                  cur[x]=i;
105                  x=e.to;//!@#$%^&
106                  break;
107              }
108          }
109          if(ok==0)
110          {
111              int m=n;
112              for(i=0;i<g[x].size ();i++)
113              {
114                  E e;
115                  e=edge[g[x][i]];
116                  if(e.c>e.f&&m>d[e.to])
117                      m=d[e.to];
118              }
119              if(--num[d[x]]==0)  break;
120              num[d[x]=m+1]++;
121              cur[x]=0;////!@#$%^^&
122              if(x!=s)
123                  x=edge[p[x]].from ;
124
125          }
126      }
127      return flow;
128  }
129
130
131 int spfa1(int s,int t)
132 {
133     queue<int > q;
134     memset(vis,0,sizeof(vis));
135     for(int i=0;i<=n;i++)
136         d1[i]=maxx;
137     d1[s]=0;
138     vis[s]=1;
139     q.push(s);
140     while(!q.empty())
141     {
142         int u;
143         u=q.front(); q.pop(); vis[u]=0;
144         for(int i=0;i<g1[u].size();i++)
145         {
146             int v;
147             v=g1[u][i].v;
148             if((d1[u]+g1[u][i].w)<d1[v])
149             {
150                 d1[v]=d1[u]+g1[u][i].w;
151                 if(!vis[v])
152                 {
153                     vis[v]=1;
154                     q.push(v);
155                 }
156             }
157         }
158     }
159     return d1[t];
160 }
161 int spfa2(int s,int t)
162 {
163     queue<int > q;
164     memset(vis,0,sizeof(vis));
165     for(int i=0;i<=n;i++)
166         d2[i]=maxx;
167     d2[s]=0;
168     vis[s]=1;
169     q.push(s);
170     while(!q.empty())
171     {
172         int u;
173         u=q.front(); q.pop(); vis[u]=0;
174         for(int i=0;i<g1[u].size();i++)
175         {
176             int v;
177             v=g1[u][i].v;
178             if((d2[u]+g1[u][i].w)<d2[v])
179             {
180                 d2[v]=d2[u]+g1[u][i].w;
181                 if(!vis[v])
182                 {
183                     vis[v]=1;
184                     q.push(v);
185                 }
186             }
187         }
188     }
189     return d2[t];
190 }
191
192
193 int main()
194 {
195     int m,i,j,a,b,s,t,t1,t2;
196     while(~scanf("%d%d",&n,&m))
197     {
198         if(n==0&&m==0)
199             break;
200         scanf("%d%d",&s,&t);
201         for(i=0;i<=n;i++)
202         {
203             g[i].clear();
204             g1[i].clear();
205         }
206         edge.clear();
207         while(m--)
208         {
209             scanf("%d%d%d%d",&a,&b,&t1,&t2);
210             node temp;
211             temp.v=b; temp.c=t2; temp.w=t1;
212             g1[a].push_back(temp);
213             temp.v=a;
214             g1[b].push_back(temp);
215
216         }
217        int ans;
218        ans=spfa1(s,t);
219        spfa2(t,s);
220        //printf("chang   %d\n",ans);
221        for(int i=1;i<=n;i++)  //构图 求最大流
222            for(int j=0;j<g1[i].size();j++)
223            {
224                int v;
225                v=g1[i][j].v;
226                //printf("%d %d %d %d %d\n",i,v,d1[i],d2[v],g[i][j].w);
227                if((d1[i]+d2[v]+g1[i][j].w)==ans||(d2[i]+d1[v]+g1[i][j].w)==ans)//
228                {
229                    //printf("iv  %d %d %d\n",i,v,g1[i][j].c);
230                    add(i,v,g1[i][j].c);////
231                }
232            }
233            //printf("***");
234            //printf("st  %d %d\n",s,t);
235            printf("ans     %d\n",maxflow(s,t,n));
236     }
237     return 0;
238 }

转载于:https://www.cnblogs.com/assult/p/3667223.html

携程 最短路径的代价相关推荐

  1. 强化学习在携程酒店推荐排序中的应用探索

    https://www.toutiao.com/a6708585355555111431/ 目前携程酒店绝大部分排序业务中所涉及的问题,基本可以通过应用排序学习完成.而其中模型训练步骤中所需的训练数据 ...

  2. 干货 | 强化学习在携程酒店推荐排序中的应用探索

    宣云儿,携程酒店排序算法工程师,主要负责酒店排序相关的算法逻辑方案设计实施.目前主要的兴趣在于排序学习.强化学习等领域的理论与应用. 前言 目前携程酒店绝大部分排序业务中所涉及的问题,基本可以通过应用 ...

  3. clickhouse集群表删除_携程用ClickHouse轻松玩转每天十亿级数据更新

    作者介绍 蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作.喜欢探索研究大数据的开源技术框架. 一.背景 携程酒店每天有上千表,累计十多亿数据更新,如何保证数据更新过程 ...

  4. Spark SQL在携程的实践经验分享

    本文根据张翼老师在2018年5月13日[第九届中国数据库技术大会]现场演讲内容整理而成. 讲师简介: 张翼,10年互联网老兵;2015年3月加入携程,携程的大数据平台技术总监,带领团队构建稳定,高效的 ...

  5. tkmybatis 子查询_日均20亿流量:携程机票查询系统的架构升级

    携程机票查询系统,日均20亿流量,且要求高吞吐,低延迟的架构设计.于是,提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能的关键.本文是携程集团机票业务技术总监宋涛在「云加社区沙龙onl ...

  6. .Net大户的选择:Windows Container在携程的应用

    数人云上海&深圳两地" 容器之Mesos/K8S/Swarm三国演义"的嘉宾精彩实录第四弹!小数已经被接连不断的干货搞晕了,沉浸技术的海洋好幸福~Windows conta ...

  7. 携程启动“2021混合办公试验”,梁建章:拥抱疫情之外的在家办公

    8月10日消息,携程集团宣布启动"2021混合办公试验".该试验将通过对2个对照组,总计数百名员工参与的混合办公综合试验,探索该形式是否可以作为公司未来长期办公形式之一. 此次&q ...

  8. 强化学习案例_强化学习实践案例!携程如何利用强化学习提高酒店推荐排序质量...

    作者简介: 宣云儿,携程酒店排序算法工程师,主要负责酒店排序相关的算法逻辑方案设计实施.目前主要的兴趣在于排序学习.强化学习等领域的理论与应用. 前言 目前携程酒店绝大部分排序业务中所涉及的问题,基本 ...

  9. 解析春运玄学:携程飞猪去哪儿们的抢票加速包,到底灵不灵?

    作者 | 鸿键 本文经授权转载自深响(ID:deep-echo) 今天,你抢票了吗? 随着春运将至,买票难这个老问题准时回归,熟悉的"火车票太难抢,需要你助我一臂之力"链接又一次集 ...

最新文章

  1. Master RenderMan Procedural Primitive DSO
  2. serverless mysql_Serverless 解惑——函数计算如何访问 MySQL 数据库
  3. 编写 matlab怎么调用 8 点和 16 点的 fft,8点基于DIT的FFT的实现
  4. .net 实现文件下载2
  5. centos6.8安装node
  6. 记一次企业级爬虫系统升级改造(一)
  7. 分布式存储MooseFS的搭建
  8. centos 7.6安装java_安装 QRadar Community Edition
  9. 微课|中学生可以这样学Python(1.2节):IDLE环境使用简介
  10. Struts2标签库(三)之表单标签
  11. UIApplication深入学习 调用程序开自身软件 发短信 打电话等
  12. 用VAE(variational autoencoder)做sentence embedding/representation或者其他任何结构数据的热presentation...
  13. python培训拾遗
  14. python依赖包冲突
  15. pyhook3安装教程及与之相关的一些问题的解决方法
  16. 一起学libcef--libcef的基本类和方法介绍(如何产生一个你自己的浏览器)
  17. 一个并肩战斗的同事将离开团队,去家乡追寻梦想
  18. Gromacs—GMX
  19. 从MWC 2016看手机发展
  20. 2018年SCI论文--整合GEO数据挖掘完整复现 四 :差异表达(GSE65635)

热门文章

  1. easyui datagrid 多列排序,该如何处理[多列同时order,只针对某一列order]
  2. css画心形原理,CSS画心形的三种方法
  3. 电脑自动打开代理服务器无法上网解决方案
  4. Ubuntu 16.04版本的 网易云音乐 linux 安装包资源以及下载过程
  5. Echarts icon图标 默认样式 样式总结
  6. 测试用例设计—场景分析法
  7. 后端工程师的前端之路系列--小程序学习
  8. 极米、当贝、坚果3000内的投影仪有什么推荐?
  9. 一个程序员竟然喜欢上了写诗
  10. 视频教程-微信公众平台开发入门-微信开发