正题

题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id=4124


题目大意

给出nnn个点mmm条边的一张有向图,边有边权,qqq次询问从点111走到点xxx的所有路径(可以重复经过任何点包括点xxx)中极差最大是多少。

1≤n≤2×105,1≤m≤5×1051\leq n\leq 2\times 10^5,1\leq m\leq 5\times 10^51≤n≤2×105,1≤m≤5×105


解题思路

首先肯定要tarjantarjantarjan缩点,然后考虑怎么统计极差。

考虑到极差其实到某个位置的时候就已经不会再改变了,而且这个到这个位置的路径一定是作为最小值或者最大值的。

所以我们可以维护一个路径上的最大值/最小值和最大极差,然后每次考虑新的转移会不会更新极差就可以了。

时间复杂度:O(n+m)O(n+m)O(n+m)

CometOJ评测机炸了,代码没测就当过了吧…


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10;
int n,m,t,cnt,dfn[N],low[N],col[N],in[N];
int mi[N],mx[N],Mi[N],Mx[N],ans[N];
stack<int> s;queue<int> q;bool ins[N];
vector<pair<int,int> > G[N],T[N];
void tarjan(int x){dfn[x]=low[x]=++cnt;ins[x]=1;s.push(x);for(int i=0;i<G[x].size();i++){int y=G[x][i].first;if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){while(s.top()!=x){col[s.top()]=x;ins[s.top()]=0;s.pop();}col[x]=x;ins[x]=0;s.pop();}return;
}
void Topsort(){for(int i=1;i<=n;i++)if(!in[i])q.push(i);while(!q.empty()){int x=q.front();q.pop();Mx[x]=max(Mx[x],mx[x]);Mi[x]=min(Mi[x],mi[x]);ans[x]=max(ans[x],mx[x]-Mi[x]);ans[x]=max(ans[x],Mx[x]-mi[x]);for(int i=0;i<T[x].size();i++){int y=T[x][i].first,w=T[x][i].second;in[y]--;Mx[y]=max(Mx[y],max(Mx[x],w));Mi[y]=min(Mi[y],min(Mi[x],w));ans[y]=max(ans[y],ans[x]);ans[y]=max(ans[y],w-Mi[x]);ans[y]=max(ans[y],Mx[x]-w);if(!in[y])q.push(y);}}return;
}
int main()
{scanf("%d%d%d",&n,&m,&t);for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);G[x].push_back(mp(y,w));}tarjan(1);memset(mi,0x3f,sizeof(mi));memset(Mi,0x3f,sizeof(Mi));for(int x=1;x<=n;x++){for(int i=0;i<G[x].size();i++){int y=G[x][i].first,w=G[x][i].second;y=col[y];if(col[x]==y)mx[y]=max(mx[y],w),mi[y]=min(mi[y],w);else T[col[x]].push_back(mp(y,w)),in[y]++;}}Topsort();while(t--){int x;scanf("%d",&x);if(x==1||!col[x])puts("-1");else printf("%d\n",ans[col[x]]);}return 0;
}

Comet OJ(Contest #14)-飞翔的小鸟【tarjan】相关推荐

  1. 符文能量(Comet OJ - Contest #8) C

    给Comet OJ打个小广告,挺好用的,比较简洁,给人感觉很好用 Contest #8是我打的第一场本oj比赛,很遗憾A了前两道傻逼题就没思路了,然后就不打算打了....... https://www ...

  2. Comet OJ - Contest #11 题解赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  3. Comet OJ - Contest #10 沉鱼落雁

    Comet OJ - Contest #10 沉鱼落雁 题目描述 胖头鱼在苦恼"沉鱼落雁"是什么好吃的东西,这很显然是因为他成语没背够. 于是他决定开始背成语.胖头鱼身为鱼界大佬, ...

  4. ACMer,OIer:Comet OJ Contest #0原创题程序设计大赛邀请!

    比赛邀请 2019年3月31日,Comet OJ主办 Comet OJ Contest #0 ,欢迎广大算法爱好者参加~ 第一名奖品:樱桃G80-3000机械键盘,第二名之后有一定比例的T恤和日系短裙 ...

  5. Comet OJ - Contest #8 E神奇函数(莫比乌斯函数容斥)

    Comet OJ - Contest #8 E神奇函数(莫比乌斯函数容斥) 题目大意 定义d(x)d(x)d(x)的值为x的最小素因子,定义 f(x)={1x=1d(x)f(xd2(x))x>1 ...

  6. Comet OJ - Contest #5 A-E

    题目链接:Comet OJ A.迫真字符串 #include<bits/stdc++.h> using namespace std; const int mx = 2e5+7; int a ...

  7. Comet OJ(Contest #8)-D菜菜种菜【树状数组,指针】

    前言 话说昨晚写题的时候贼NMNMNM惊险,最后22秒把程序交了上去竟然过了 正题 题目链接:https://cometoj.com/contest/58/problem/D?problem_id=2 ...

  8. Comet OJ(Contest #8)-C符文能量【dp】

    正题 题目链接:https://cometoj.com/contest/58/problem/C?problem_id=2760 题目大意 若干个数对(ai,bi)(a_i,b_i)(ai​,bi​) ...

  9. Comet OJ - Contest #5 迫真小游戏

    https://www.cometoj.com/contest/46/problem/C?problem_id=2028 思路:一层一层设置:优先设置编号小的,每次设置一个,将其限制的层减少,如果该层 ...

最新文章

  1. HDU 1501 Zipper
  2. 天猫精灵可以当电脑音响吗_天猫精灵推出便携式投影仪,小到可以装进口袋,试试效果...
  3. 【飞谷六期】爬虫项目1
  4. linux内核在什么目录结构,Linux Kernel 目录结构说明
  5. 百度Google搜索框中,你不知道的变化
  6. 上车时机已到--.NETCore是适应时代发展的雄鹰利剑
  7. android 渠道方案,Android多渠道打包时获取当前渠道的方法
  8. Python实现RabbitMQ中6种消息模型(转)
  9. shell习题第22题:
  10. Linux shell中2>1的含义
  11. 京东风格的移动端Vue组件库NutUI2.0来啦
  12. qt.qpa.xcb: could not connect to display解决
  13. 生活小常识:增发防脱发
  14. 自学系列-有哪些高质量的自学网站
  15. latex表格过长的解决办法之一:缩小字体
  16. ssd [Error] UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position【已解决】
  17. 如何centos7中查看IP地址
  18. Android中绘图板的实现
  19. 深度学习之yolov5目标识别全过程记录(纯小白)
  20. Linux 网络基础(二)---传输层

热门文章

  1. linux lua socket编程,CentOs 安装lua,luasocket
  2. 为什么年龄大了近视还增加_年龄明明一样大,为什么有人长得年轻,有人显老呢?...
  3. linux expr格式,计算2-expr命令举例
  4. mysql5.5 mysqli_php5.5.38增加mysqli扩展
  5. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
  6. ros发布节点信息python_vscode开发ROS1(13)-python实现话题通信(msg)
  7. 调整png的不透明度_TGA与PNG的优劣对比
  8. 地线与接地螺丝_电气接地规范与接地的各项参数
  9. 9050 端口 linux 进程,windows和linux查看端口占用情况
  10. java pc计数器_java虚拟机-程序计数器PC Register