银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星。

我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 1。

现在对于 N 颗我们关注的恒星,有 M 对亮度之间的相对关系已经判明。

你的任务就是求出这 N 颗恒星的亮度值总和至少有多大。

输入格式

第一行给出两个整数 N 和 M。

之后 M 行,每行三个整数 T,A,B,表示一对恒星 (A,B) 之间的亮度关系。恒星的编号从 1 开始。

如果 T=1,说明 A 和 B 亮度相等。
如果 T=2,说明 A 的亮度小于 B 的亮度。
如果 T=3,说明 A 的亮度不小于 B 的亮度。
如果 T=4,说明 A 的亮度大于 B 的亮度。
如果 T=5,说明 A 的亮度不大于 B 的亮度。

输出格式

输出一个整数表示结果。

若无解,则输出 −1−1。

数据范围

N≤100000,M≤10000

输入样例:

5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1

输出样例:

11

这里也可以用差分约束的做法:

(15条消息) 《图论:差分约束算法详解 + 算法证明》+ 模板题:糖果_wsh1931的博客-CSDN博客 这两个题目是一样的连数据都是一样的,但上面用的是差分约束的做法

我们重点将一下tarjan算法:

若不懂tarjan算法的可以看看这篇博客:(15条消息) 有向图强连通分量tarjan算法详解(适合新手) + 模板题:《信息学奥赛一本通》 , USACO , HAOI2006 受欢迎的牛_wsh1931的博客-CSDN博客

1:首先建边和差分约束是一样的:

t == 1, a >= b, b >= a

t == 2, b >= a + 1;

t == 3, a >= b

t == 4, a >= b + 1

t == 5, b >= a;

if (t == 1)
{add(h, a, b, 0);add(h, b, a, 0);
}
else if (t == 2) add(h, a, b, 1);
else if (t == 3) add(h, b, a, 0);
else if (t == 4) add(h, b, a, 1);
else if (t == 5) add(h, a, b, 0);

在建立一个超级源点,这个点的特性是可以遍历到所有的其他点,又因为亮度最小为一,所以我们从0 -> i 建立一条长度为1的点

for (int i = 1; i <= n; i ++ ) add(h, 0, i, 1);

2:利用tarjan算法缩点

因为每个联通分量的每个点都可以相互到达,所以若是一个联通分量的权值大于1则说明他是一个正环,即代表无解的情况

3:最后建图,利用联通分量递减的顺序是拓扑图的性质计算出最大值.

以上说的名词和性质在tarjan算法模板里面都有证明。

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;typedef long long LL;const int N = 100010, M = 600010;//首先题目输入可能都是双向边则有2 * N,建立超级源点N,//要新建一个图3 * N所以共6 * N个点
int n, m;
int id[N];
int dist[N];
stack<int> stk;
bool in_stk[N];
int Size[N], scc_cnt;
int dfn[N], low[N], timestamp;
int h[N], hs[N], e[M], ne[M],w[M], idx;void add(int h[], int a, int b, int c)//邻接表
{e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx;idx ++ ;
}void tarjan(int u)//tarjan算法模板,若不懂tarjan的同学可以看:https://blog.csdn.net/qq_61935738/article/details/126738405
{dfn[u] = low[u] = ++ timestamp;stk.push(u), in_stk[u] = true;for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (!dfn[j]){tarjan(j);low[u] = min(low[u], low[j]);}else if (in_stk[j]) low[u] = min(low[u], dfn[j]);}if (dfn[u] == low[u]){int y;scc_cnt ++ ;do{y = stk.top();stk.pop();in_stk[y] = false;id[y] = scc_cnt;Size[scc_cnt] ++ ;} while (y != u);}
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);while (m -- )//读入每种情况{int t, a, b;scanf("%d %d %d", &t, &a, &b);if (t == 1){add(h, a, b, 0);add(h, b, a, 0);}else if (t == 2) add(h, a, b, 1);else if (t == 3) add(h, b, a, 0);else if (t == 4) add(h, b, a, 1);else if (t == 5) add(h, a, b, 0);}for (int i = 1; i <= n; i ++ ) add(h, 0, i, 1);//建立超级源点tarjan(0);//因为0可以遍历到所有点,所以从0开始bool success = true;for (int i = 0; i <= n; i ++ )//缩点之后建图{for (int j = h[i]; j != -1; j = ne[j]){int k = e[j];int a = id[i], b = id[k];if (a == b)//若他们在一个联通块中{if (w[j] > 0)//因为亮度最小为1,若一个联通块中存在权值大于0的边,则存在正环{success = false;break;}}else add(hs, a, b, w[j]);//否则建图}if (!success) break;}if (!success) puts("-1");//无解else{for (int i = scc_cnt; i ; i -- )//按连通块递减的顺序是拓扑图for (int j = hs[i]; j != -1; j = ne[j]){int k = e[j];dist[k] = max(dist[k], dist[i] + w[j]);//求最小用的是最长路,证明模板里也有}LL res = 0;for (int i = 1; i <= scc_cnt; i ++ ) res += (LL)dist[i] * Size[i];//将每个连通块中的点到起点0的权值全部加起来即为答案cout << res << endl;}return 0;}

《算法竞赛进阶指南》tarjan做法 银河相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  3. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  4. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  5. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  6. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean
  2. 一个实用技巧,告别手动画图,自动生成数据库 ER 图|原创
  3. CVPR 2021 | 国防科大:基于几何稳定性分析的物体位姿估计方法
  4. Dcloud课程1 APP的架构有哪些
  5. js Array.prototype.slice.call(arguments,0) 理解
  6. cacti登录密码忘记解决方法
  7. android SDK 代理配置(东北大学)
  8. python字典按照value进行排序
  9. 系统分析和设计方法之可行性分析和系统方案建议
  10. VS2003安装步骤及其错误
  11. C++ std::condition_variable::notify_one()与notify_all()
  12. Orz是什么意思……
  13. nginx-http-sysguard模块
  14. 用Python制作动态饼图
  15. ZYNQ 或ZYNQ Ultrascale PS/PL交互
  16. 【P秋色的小课堂】第一课
  17. 视频画面裁剪怎么弄?分享几个实用技巧
  18. git commit 提交报错 husky > pre-commit 问题
  19. 电烙铁的焊接方法图解
  20. 一些适合刷算法的网站

热门文章

  1. 感悟人生的伤感日志_带着眼泪去流浪
  2. 基于Java Web的流浪猫狗救助网站
  3. 电容麦克风的幻象供电
  4. STM32的串口中断详解
  5. 【免费】小米即时消息云MIMC介绍——免费、简单实现IM
  6. 计算机专业省赛一等奖有什么好处,竞赛省一等奖有什么用
  7. Ele睡眠面膜,祛痘、去痘印、美白功效
  8. 老毛桃制作linux u盘系统盘,使用U盘制作linux服务器启动盘,U盘制作普通系统盘的制作过程也是一样...
  9. 用Python实现DT算法
  10. 日本美女机器人 婀娜多姿会回眸一笑(图)