飞翔的小鸟
时间:2019-11-15
本文章向大家介绍飞翔的小鸟,主要包括飞翔的小鸟使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include<iostream> #include<vector> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> #include<stack> #include<map> #define maxn 200110 using namespace std; int top; typedef long long ll; int n, m, q; stack<int>s; struct Node { int p; int len; Node(int a, int b) :p(a), len(b) {} }; int maxx[maxn*3];//1到i的最大值 int minn[maxn*3];//1到i的最小值 vector<Node>G[maxn], G2[3*maxn]; void insert(int be, int en, int len) { G[be].push_back(Node(en, len)); } int dfn[maxn], low[maxn], df, clor[maxn], ans; int list[maxn]; int cn = 0; int tarjan(int x) { low[x] = dfn[x] = ++df; s.push(x); for (int i = 0; i < G[x].size(); i++) { int p = G[x][i].p; if (!dfn[p]) { tarjan(p); low[x] = min(low[x], low[p]); } else if (!clor[p]) { low[x] = min(low[x], dfn[p]); } } if (dfn[x] == low[x]) { ans++; while (1) { int a = s.top(); s.pop(); clor[a] = ans; if (a == x) break; } } return 0; } int de[maxn*3]; int num = 0; int LL[maxn], mid[maxn], RR[maxn]; int find_() { tarjan(1); for (int i = 1; i <= n; i++) list[clor[i]]++; for (int i = 1; i <= ans; i++) { if (list[i] > 1) { LL[i] = ++num; mid[i] = ++num; RR[i] = ++num; } else { LL[i] = mid[i] = RR[i] = ++num; } } for (int i = 1; i <= n; i++) minn[i] = 1e9 + 10000; for (int i = 1; i <= n; i++) { if (!dfn[i]) continue; for (int j = 0; j < G[i].size(); j++) { int be = clor[i]; int en = clor[G[i][j].p]; if (be == en) { maxx[be] = max(maxx[be], G[i][j].len); minn[be] = min(minn[be], G[i][j].len); } else { G2[RR[be]].push_back(Node(LL[en], G[i][j].len)); de[LL[en]]++; } } } for (int i = 1; i <= ans; i++) { if (list[i] > 1) { G2[LL[i]].push_back(Node(mid[i], maxx[i])); G2[mid[i]].push_back(Node(RR[i], minn[i])); de[mid[i]]++; de[RR[i]]++; } } return 0; } int chal[maxn*3]; int topu() { queue<int>que; memset(chal, -1, sizeof(chal)); memset(maxx, -1, sizeof(maxx)); for (int i = 1; i <= num; i++) minn[i] = 0x3f3f3f3f; for (int i = 1; i <= num; i++) if (de[i] == 0) que.push(i); while (!que.empty()) { int x = que.front(); que.pop(); for (int i = 0; i < G2[x].size(); i++) { int p = G2[x][i].p; int ln = G2[x][i].len; de[p]--; int tx = max(maxx[x], ln), tm = min(minn[x], ln); maxx[p] = max(maxx[p], tx); minn[p] = min(minn[p], tm); chal[p] = max(chal[p], max(chal[x], max(tx - ln, ln - tm))); if (!de[p]) { que.push(p); } } } return 0; } int main() { int be, en, len; scanf("%d %d %d", &n, &m, &q); for (int i = 0; i < m; i++) { scanf("%d %d %d", &be, &en, &len); insert(be, en, len); } find_();//缩点,建边 topu(); int xx; while (q--) { scanf("%d", &be); if (!dfn[be] ) printf("-1\n"); else printf("%d\n", chal[RR[clor[be]]]); } return 0; }
原文地址:https://www.cnblogs.com/lesning/p/11865914.html
- Vue.js系列之一初识Vue
- EF 数据库连接约定(Connection String Conventions in Code First)
- 微信小程序使用WebSokcet实现相关请求
- Vue.js系列之二Vue实例
- autoload自动加载机制使用
- EF 约定介绍
- 关于EF Code First模式不同建模方式对建表产生的影响
- C# 命名空间和程序集
- C# new关键字和对象类型转换(双括号、is操作符、as操作符)
- 防止小程序多次点击跳转解决方案
- 详述 SQL 中的 distinct 和 row_number() over() 的区别及用法
- Web API系列之三 基本功能实现
- 微信小程序的省市选择组件 citySelector分享
- 详述 Java 语言中的 String、StringBuffer 和 StringBuilder 的使用方法及区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ES分页看这篇就够了
- ES系列之原来查看文档数量有这么多姿势
- ES系列之嵌套文档和父子文档
- ES系列之一文带你避开日期类型存在的坑
- ES系列之原来ES的聚合统计不准确啊
- fastjson远程代码执行漏洞问题分析
- 数据库连接池的原理没你想得这么复杂
- 你真的会用volatile吗
- 你真的了解LinkedBlockingQueue的put,add和offer的区别吗
- 关于Java使用groupingBy分组数据乱序问题
- 详解 java CompletableFuture
- 从一个问题来解释下什么是mysql的可重复读
- 每个人都用得到的频数分布直方图
- 利用箱线图巧剔异常值
- dubbo服务接口设计的几个建议