银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星。
我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 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。
数据范围
N≤100000,M≤100000N≤100000,M≤100000
输入样例:
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1

输出样例:
11

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010, M = 600010;
typedef long long LL;
int n, m;
int h[N], hs[N], e[M], w[M], ne[M], idx;
int dfn[N], low[N], timestamp;
int stk[N], top;
bool in_stk[N];
int id[N], scc_cnt, Size[N];
int dist[N];
void add(int h[], int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
void tarjan(int u){dfn[u] = low[u] = ++timestamp;stk[++ top] = u, in_stk[u] = true;for (int i = h[u]; ~i; 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]){++ scc_cnt;int y;do{y = stk[top --];in_stk[y] = false;id[y] = scc_cnt;Size[scc_cnt] ++;}while(y != u);}
}
int main(){scanf("%d%d", &n, &m);memset(h, -1, sizeof h);memset(hs, -1, sizeof hs);for (int i = 1; i <= n; i ++)   add(h, 0, i, 1);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      add(h, a, b, 0);}tarjan(0);bool success = true;for (int i = 0; i <= n; i ++){for (int j = h[i]; ~j; j = ne[j]){int k = e[j];int a = id[i], b = id[k];if (a == b){if (w[j] > 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; 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];cout << res << endl;}return 0;
}

有向图的强连通分量----------银河相关推荐

  1. 有向图的强连通分量——银河

    银河 银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星. 我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 1. 现在对于 N 颗我们关注的恒星,有 M 对亮度之间的相对关系 ...

  2. 有向图的强连通分量(SCC)

    有向图的强连通分量(SCC) 1. 有向图的强连通分量原理 原理 强连通分量是针对有向图来说的.如下的讲解默认都是针对有向图的. 连通分量:对于一个有向图中的一些点来说,如果任意两点都能相互到达,则称 ...

  3. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  4. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  5. C++Kosaraju找有向图的强连通分量算法(附完整源码)

    C++Kosaraju找有向图的强连通分量算法 C++Kosaraju找有向图的强连通分量算法完整源码(定义,实现,main函数测试) C++Kosaraju找有向图的强连通分量算法完整源码(定义,实 ...

  6. 缩点(有向图的强连通分量)学习笔记

    缩点(有向图的强连通分量)学习笔记 1.什么是强连通分量?: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路 ...

  7. 有向图的强连通分量,割点与桥

    有向图的强连通分量 1.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> #include<stdio.h> #includ ...

  8. 求无向图的连通分量或有向图的强连通分量—tarjan()ccf高速公路

    概念定义: 在图论中,连通图基于连通的概念. 1. 连通(无向图): 若顶点Vi能通过路径到达Vj,那么称为Vi和Vj是连通的 对无向图:若从顶点Vi到顶点Vj有路径相连(当然从j到i也一定有路径), ...

  9. 有向图的强连通分量算法

    有向图的强连通分量算法 强连通分量定义 在有向图中,某个子集中的顶点可以直接或者间接互相可达,那么这个子集就是此有向图的一个强连通分量,值得注意的是,一旦某个节点划分为特定的强连通分量后,此顶点不能在 ...

最新文章

  1. c语言怎样定义函数举例,c语言怎样定义函数?
  2. 2017年2月18日 K-means
  3. 10 个强大的 Apache 模块
  4. php 画布插入图像,javascript – 如何在PHP中将html5画布图像保存到数据库
  5. jenkins+git+maven搭建项目自动化持续集成
  6. 160804、oracle查询:取出每组中的第一条记录
  7. csgo一键跳投_个人csgo单练cfg参数和投掷物,附带一期叉车教学,萌新佛系休闲党必备...
  8. new Date()时间
  9. python如何爬取豆瓣_Python实战之如何爬取豆瓣电影?本文教你
  10. 【BP神经网络】使用反向传播训练多层神经网络的原则+“常见问题”
  11. odoo10参考系列--视图二(表单视图)
  12. 基于嵌入式系统的gnash最小库依赖关系
  13. 力扣 独一无二的出现次数
  14. 计算机二级 java和web_2016计算机二级web程序设计判断题及答案
  15. Linux 快捷键总结
  16. Android - Md5加密 工具类
  17. 机器视觉学习笔记(6)——双目摄像机标定参数说明
  18. Consider defining a bean of type ‘com.xingchen.media.service.MediaFileService‘ in your configuration
  19. 【渝粤题库】广东开放大学 建筑构造 形成性考核
  20. 银河麒麟V10 远程桌面

热门文章

  1. 设计思维引导设计实践
  2. xilinx debug
  3. python mse函数_Python 线性回归处理糖尿病数据 计算MSE等
  4. ABCD选项的排序方式
  5. (附源码)springboot学生宿舍管理系统 毕业设计453155
  6. 5 机器学习 朴素贝叶斯算法 高斯模型 多项式模型 伯努利模型 拉普拉普平滑系数 TfidfVectorizer
  7. 第十二周 任务四
  8. 各串口设备节点/dev/tty* 的区别
  9. 全国计算机二级考试设置地点,黑龙江2020年3月全国计算机等级考试考点设置
  10. ZOJ 3886 Nico Number (线段树)