携程 最短路径的代价
携程的一道图论题
题意:给出一张无向图 每条边有一个长度和 删除该边的权值 再给出起点和终点 求从起点到终点的最短路增加 要删除的边的最小的权值和。
【思路】要使 从起点到终点的最短路长度增加 就要把该最短路破坏掉 从起点到终点的最短路可能不止一条,我们可以把 这些路径都找出来 重新构成一个图
再求这个图的最小割 就是答案了 怎么把这些路径都找出来呢 求两次最短路 第一次求 所有点到起点的最短路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
携程 最短路径的代价相关推荐
- 强化学习在携程酒店推荐排序中的应用探索
https://www.toutiao.com/a6708585355555111431/ 目前携程酒店绝大部分排序业务中所涉及的问题,基本可以通过应用排序学习完成.而其中模型训练步骤中所需的训练数据 ...
- 干货 | 强化学习在携程酒店推荐排序中的应用探索
宣云儿,携程酒店排序算法工程师,主要负责酒店排序相关的算法逻辑方案设计实施.目前主要的兴趣在于排序学习.强化学习等领域的理论与应用. 前言 目前携程酒店绝大部分排序业务中所涉及的问题,基本可以通过应用 ...
- clickhouse集群表删除_携程用ClickHouse轻松玩转每天十亿级数据更新
作者介绍 蔡岳毅,携程酒店大数据高级研发经理,负责酒店数据智能平台研发,大数据技术创新工作.喜欢探索研究大数据的开源技术框架. 一.背景 携程酒店每天有上千表,累计十多亿数据更新,如何保证数据更新过程 ...
- Spark SQL在携程的实践经验分享
本文根据张翼老师在2018年5月13日[第九届中国数据库技术大会]现场演讲内容整理而成. 讲师简介: 张翼,10年互联网老兵;2015年3月加入携程,携程的大数据平台技术总监,带领团队构建稳定,高效的 ...
- tkmybatis 子查询_日均20亿流量:携程机票查询系统的架构升级
携程机票查询系统,日均20亿流量,且要求高吞吐,低延迟的架构设计.于是,提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能的关键.本文是携程集团机票业务技术总监宋涛在「云加社区沙龙onl ...
- .Net大户的选择:Windows Container在携程的应用
数人云上海&深圳两地" 容器之Mesos/K8S/Swarm三国演义"的嘉宾精彩实录第四弹!小数已经被接连不断的干货搞晕了,沉浸技术的海洋好幸福~Windows conta ...
- 携程启动“2021混合办公试验”,梁建章:拥抱疫情之外的在家办公
8月10日消息,携程集团宣布启动"2021混合办公试验".该试验将通过对2个对照组,总计数百名员工参与的混合办公综合试验,探索该形式是否可以作为公司未来长期办公形式之一. 此次&q ...
- 强化学习案例_强化学习实践案例!携程如何利用强化学习提高酒店推荐排序质量...
作者简介: 宣云儿,携程酒店排序算法工程师,主要负责酒店排序相关的算法逻辑方案设计实施.目前主要的兴趣在于排序学习.强化学习等领域的理论与应用. 前言 目前携程酒店绝大部分排序业务中所涉及的问题,基本 ...
- 解析春运玄学:携程飞猪去哪儿们的抢票加速包,到底灵不灵?
作者 | 鸿键 本文经授权转载自深响(ID:deep-echo) 今天,你抢票了吗? 随着春运将至,买票难这个老问题准时回归,熟悉的"火车票太难抢,需要你助我一臂之力"链接又一次集 ...
最新文章
- Master RenderMan Procedural Primitive DSO
- serverless mysql_Serverless 解惑——函数计算如何访问 MySQL 数据库
- 编写 matlab怎么调用 8 点和 16 点的 fft,8点基于DIT的FFT的实现
- .net 实现文件下载2
- centos6.8安装node
- 记一次企业级爬虫系统升级改造(一)
- 分布式存储MooseFS的搭建
- centos 7.6安装java_安装 QRadar Community Edition
- 微课|中学生可以这样学Python(1.2节):IDLE环境使用简介
- Struts2标签库(三)之表单标签
- UIApplication深入学习 调用程序开自身软件 发短信 打电话等
- 用VAE(variational autoencoder)做sentence embedding/representation或者其他任何结构数据的热presentation...
- python培训拾遗
- python依赖包冲突
- pyhook3安装教程及与之相关的一些问题的解决方法
- 一起学libcef--libcef的基本类和方法介绍(如何产生一个你自己的浏览器)
- 一个并肩战斗的同事将离开团队,去家乡追寻梦想
- Gromacs—GMX
- 从MWC 2016看手机发展
- 2018年SCI论文--整合GEO数据挖掘完整复现 四 :差异表达(GSE65635)