填坑进行时……链接: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相关推荐

  1. 倍增LCA NOIP2013 货车运输

    货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...

  2. poj1330|bzoj3732|noip2013 货车运输 kruskal+倍增lca

    学了一早上倍增,感觉lca还是tarjan好写. poj1330 1 #include <stdio.h> 2 #include <string.h> 3 #include & ...

  3. 货车运输题解 最大生成树+lca

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条 ...

  4. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  5. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. 1 #include<iostr ...

  6. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  7. NOIP2013货车运输

    NOIP2013货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超 ...

  8. noip 2013 洛谷 P1967 货车运输

    题目:货车运输 大致题意: 给出一张无向带权图,对于m个询问(X,Y),要求找出X到Y的一条路径使得路径上的最小边权最大,并输出这个最小边权. 思路: 可以看出,X到Y的满足条件的路径一定在原图的最大 ...

  9. LUOGU 1967 货车运输 [noip 2013]

    * 1967 货车运输 * 题目描述 AA 国有 n n 座城市,编号从 1 1 到 nn ,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司 ...

  10. 货车运输--kruscal重构树板子

    前置知识: kruscal重构树 用于求解有关两点间路径最大边权最小值和最小边权最大值问题 求解两点间路径最大边权最小值--最大生成树思想,优先选择权值大的边 求解两点间路径最小边权最大值--最小生成 ...

最新文章

  1. Java 枚举(enum)详解
  2. 基于XML及注解配置方式实现AOP及aspectJ表达式
  3. Python单元测试介绍及单元测试理解,单元测试的自动生成(对函数进行测试)
  4. 使用Docker快速搭建生产环境
  5. 利用Python实现一个感知机学习算法
  6. Laravel 使用firstOrCreate 报错MassAssignmentException
  7. interlib系统服务器,Interlib图书馆集群管理系统.docx
  8. Linux中PLSQL视频,PLSQL使用视频教程:PLSQL的使用方法
  9. iPhone 总是提示 无法验证服务器身份 a.wunderlist.com 解决办法
  10. 【日常篇】006_从黑体辐射到RGB——如何定量计算光谱的颜色?
  11. 盈科律师事务所高级合伙人刘晓雪:锤子科技已举步维艰
  12. mame4android汉化,MAME4droid
  13. 牛客多校第八场 C CDMA 线性代数:沃尔什矩阵
  14. 中山医06年考研初试复试全攻略!( 完整版)
  15. 知识付费开始进入深水区,知乎这两个动作有何深意?
  16. 花样16流水灯c语言程序,单片机控制花样流水灯原理图及程序
  17. 1-4 CAD 圆弧(arc)
  18. 不允许使用不完整的类型_孩子,我允许你不优秀,但我不允许你不努力!
  19. Nehe教程16课雾
  20. MySQL常用的文本文件导出导入方式总结

热门文章

  1. oracle dbms_lob trim,DBMS_LOB包基础应用
  2. Ansible—— 29. 通过set_fact模块定义变量
  3. vba 发送邮件 html,使用VBA实现发邮件功能
  4. c语言小游戏 贪吃蛇
  5. 【程序设计训练】1-7 F1方程式冠军
  6. javascript中function前面加(/!/+/-/~的含义
  7. Oracle 游标详解(cursor)
  8. 英语论文写作笔记一则
  9. 利用IE的追踪保护加载项,给IE增加去广告功能
  10. 临时增大 tmp 空间