cogs1439 货车运输 LCA
填坑进行时……链接:http://cogs.pro/cogs/problem/problem.php?pid=1439
题意:找出两点间最短路上最大的货运量。
这题正解是网络流图论里的东西。首先我们可以想到一个图里面,边权最大的边一定是在这个图的最大生成树上面的,那么我们就先跑出最大生成树。
跑完后,两点间最大边权就可以直接用$LCA$动态查询即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10005,maxm=50005; 7 int fa[maxn]; 8 int getfa(int x) 9 { 10 return fa[x]==x?x:fa[x]=getfa(fa[x]); 11 } 12 void unionn(int x,int y) 13 { 14 x=getfa(x),y=getfa(y); 15 if(x!=y)fa[y]=x; 16 } 17 struct node 18 { 19 int from,to,dis,next; 20 }edge[maxn<<1],tmp[maxm]; 21 int head[maxn],tot; 22 void addedge(int u,int v,int w) 23 { 24 edge[++tot]=(node){u,v,w,head[u]};head[u]=tot; 25 } 26 int cmp(const node &a,const node &b) 27 { 28 return a.dis>b.dis; 29 } 30 int n,m,q; 31 void Kruskal() 32 { 33 for(int i=1;i<=n;i++)fa[i]=i; 34 int cnt=0; 35 sort(tmp+1,tmp+m+1,cmp); 36 for(int i=1;i<=m;i++) 37 { 38 int u=tmp[i].from,v=tmp[i].to; 39 if(getfa(u)!=getfa(v)) 40 { 41 unionn(u,v); 42 int w=tmp[i].dis; 43 addedge(u,v,w);addedge(v,u,w);cnt++; 44 if(cnt==n-1)break; 45 } 46 } 47 } 48 int p[maxn][32],dep[maxn],dis[maxn][32]; 49 void dfs(int u,int dept,int fa) 50 { 51 dep[u]=dept; 52 for(int i=head[u];i;i=edge[i].next) 53 { 54 int v=edge[i].to; 55 if(v!=p[u][0]) 56 { 57 p[v][0]=u;dis[v][0]=edge[i].dis; 58 dfs(v,dept+1,fa); 59 } 60 } 61 } 62 void init() 63 { 64 for(int i=1;(1<<i)<=n;i++) 65 for(int j=1;j<=n;j++)p[j][i]=-1,dis[j][i]=2147483647; 66 for(int j=1;(1<<j)<=n;j++) 67 for(int i=1;i<=n;i++) 68 if(p[i][j-1]!=-1)p[i][j]=p[p[i][j-1]][j-1],dis[i][j]=min(dis[i][j-1],dis[p[i][j-1]][j-1]); 69 } 70 int lca(int x,int y) 71 { 72 int i,res=2147483647;if(dep[x]<dep[y])swap(x,y); 73 for(i=0;(1<<i)<=dep[x];i++);i--; 74 for(int j=i;j>=0;j--) 75 if(dep[x]-(1<<j)>=dep[y])res=min(res,dis[x][j]),x=p[x][j]; 76 if(x!=y) 77 { 78 for(int j=i;j>=0;j--) 79 if(p[x][j]!=p[y][j])res=min(res,min(dis[x][j],dis[y][j])),x=p[x][j],y=p[y][j]; 80 res=min(res,min(dis[x][0],dis[y][0])); 81 } 82 return res; 83 } 84 int haha() 85 { 86 freopen("truck.in","r",stdin); 87 freopen("truck.out","w",stdout); 88 scanf("%d%d",&n,&m); 89 for(int i=1;i<=m;i++) 90 { 91 int x,y,z;scanf("%d%d%d",&x,&y,&z); 92 tmp[i]=(node){x,y,z,0}; 93 } 94 Kruskal();dfs(1,1,0);init(); 95 scanf("%d",&q); 96 for(int i=1;i<=q;i++) 97 { 98 int x,y;scanf("%d%d",&x,&y); 99 if(getfa(x)!=getfa(y))puts("-1"); 100 else printf("%d\n",lca(x,y)); 101 } 102 } 103 int sb=haha(); 104 int main(){;}
cogs1439
转载于:https://www.cnblogs.com/Loser-of-Life/p/7347947.html
cogs1439 货车运输 LCA相关推荐
- 倍增LCA NOIP2013 货车运输
货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...
- poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca
学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...
- 货车运输题解 最大生成树+lca
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- NOIP2013货车运输
NOIP2013货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超 ...
- noip 2013 洛谷 P1967 货车运输
题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...
- LUOGU 1967 货车运输 [noip 2013]
* 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...
- 货车运输--kruscal重构树板子
前置知识: kruscal重构树 用于求解有关两点间路径最大边权最小值和最小边权最大值问题 求解两点间路径最大边权最小值--最大生成树思想,优先选择权值大的边 求解两点间路径最小边权最大值--最小生成 ...
最新文章
- Java 枚举(enum)详解
- 基于XML及注解配置方式实现AOP及aspectJ表达式
- Python单元测试介绍及单元测试理解,单元测试的自动生成(对函数进行测试)
- 使用Docker快速搭建生产环境
- 利用Python实现一个感知机学习算法
- Laravel 使用firstOrCreate 报错MassAssignmentException
- interlib系统服务器,Interlib图书馆集群管理系统.docx
- Linux中PLSQL视频,PLSQL使用视频教程:PLSQL的使用方法
- iPhone 总是提示 无法验证服务器身份 a.wunderlist.com 解决办法
- 【日常篇】006_从黑体辐射到RGB——如何定量计算光谱的颜色?
- 盈科律师事务所高级合伙人刘晓雪:锤子科技已举步维艰
- mame4android汉化,MAME4droid
- 牛客多校第八场 C CDMA 线性代数:沃尔什矩阵
- 中山医06年考研初试复试全攻略!( 完整版)
- 知识付费开始进入深水区,知乎这两个动作有何深意?
- 花样16流水灯c语言程序,单片机控制花样流水灯原理图及程序
- 1-4 CAD 圆弧(arc)
- 不允许使用不完整的类型_孩子,我允许你不优秀,但我不允许你不努力!
- Nehe教程16课雾
- MySQL常用的文本文件导出导入方式总结
热门文章
- oracle dbms_lob trim,DBMS_LOB包基础应用
- Ansible—— 29. 通过set_fact模块定义变量
- vba 发送邮件 html,使用VBA实现发邮件功能
- c语言小游戏 贪吃蛇
- 【程序设计训练】1-7 F1方程式冠军
- javascript中function前面加(/!/+/-/~的含义
- Oracle 游标详解(cursor)
- 英语论文写作笔记一则
- 利用IE的追踪保护加载项,给IE增加去广告功能
- 临时增大 tmp 空间