Tarjan

2822 爱在心中

** 时间限制: 1 s

** 空间限制: 128000 KB

** 题目等级 : 钻石 Diamond

题解

题目描述 Description“每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动。爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home。”在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。

如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。

现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。输入描述 Input Description第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。

第2到第M+1行,每行两个数A、B,代表A爱B。输出描述 Output Description第1行,一个数,代表爱的国度里有多少爱心天使。

第2行,如果某个爱心天使被其他所有人和爱心天使所爱则请输出这个爱心天使是由哪些人构成的(从小到大排序),否则输出-1。样例输入 Sample Input样例输入1:6 7

1 2

2 3

3 2

4 2

4 5

5 6

6 4

样例输入2:3 3

1 2

2 1

2 3样例输出 Sample Output样例输出1:2

2 3样例输出2:1

-1

codevs2282

1,求大小大于1的强联通个数,强联通缩点后,如果出度为0的强联通个数只有一个,输出这个强联通的元素,否则输出-1

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue> using namespace std;
const int maxn = 1e5+7;
const int maxm = maxn << 2; int n,m; struct Node {
int to,w,next;
} edge[maxm];
int first[maxn],sign; int dfn[maxn],low[maxn],vis[maxn],inx,cnt,col[maxn],num[maxn]; int outdegree[maxn]; stack<int>s; void clear_arr() {
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(col,0,sizeof(col));
memset(num,0,sizeof(num));
memset(outdegree,0,sizeof(outdegree));
inx = cnt = 1;
while(s.size()) {
s.pop();
}
} void init() {
for(int i = 1; i <= n; i ++ ) {
first[i] = 0;
}
sign = 1;
} void add_edge(int u,int v,int w) {
edge[sign].to = v;
edge[sign].w = w;
edge[sign].next = first[u];
first[u] = sign ++;
} void tarjan(int x) {
dfn[x] = low[x] = inx ++;
s.push(x);
vis[x] = 1; for(int i = first[x]; i ; i = edge[i].next ) {
int to = edge[i].to;
if(!dfn[to]) {
tarjan(to);
low[x] = min(low[x],low[to]);
}
else if(vis[to]) {
low[x] = min(low[x],dfn[to]);
}
}
int now;
if(low[x] == dfn[x]) {
do {
now = s.top();
s.pop();
vis[now] = 0;
col[now] = cnt;
num[cnt] ++;
} while(now != x);
cnt ++;
} } int main()
{
int u,v,w;
while(~scanf("%d %d",&n,&m)) {
init();
vector<pair<int,int> >vec;
for(int i = 1; i <= m; i ++ ) {
scanf("%d %d",&u,&v);
add_edge(u,v,1);
vec.push_back(make_pair(u,v));
}
clear_arr();
for(int i = 1; i <= n; i ++ ) {
if(!dfn[i]) {
tarjan(i);
}
} int god = 0;
for(int i = 1; i < cnt; i ++ ) {
if(num[i] > 1) {
god ++;
}
}
printf("%d\n",god); for(int i = 0; i < vec.size(); i ++ ) {
u = vec[i].first;
v = vec[i].second;
if(col[u] != col[v]) {
outdegree[col[u]] ++;
}
} int pos = -1, number = 0;
for(int i = 1; i < cnt ; i ++ ) {
if(outdegree[i] == 0 && num[i] > 1) {
pos = i;
number ++;
}
}
if(number == 1) {
vector<int>ans;
for(int i = 1; i <= n; i ++ ) {
if(col[i] == pos) {
ans.push_back(i);
}
}
for(int i = 0; i < ans.size(); i ++ ) {
if(i == 0) {
printf("%d",ans[i]);
} else {
printf(" %d",ans[i]);
}
}
puts("");
} else {
puts("-1");
}
} return 0;
}

Tarjan笔记1的更多相关文章

  1. tarjan复习笔记

    tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...

  2. $tarjan$简要学习笔记

    $QwQ$因为$gql$的$tarjan$一直很差所以一直想着要写个学习笔记,,,咕了$inf$天之后终于还是写了嘻嘻. 首先说下几个重要数组的基本定义. $dfn$太简单了不说$QwQ$ 但是因为有 ...

  3. [学习笔记]tarjan求割点

    都口胡了求割边,就顺便口胡求割点好了QAQ 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访问,并在回溯后更新 2.如果某个邻接点已被访问过,则更新 对于当前 ...

  4. [学习笔记]tarjan求割边

    上午打模拟赛的时候想出了第三题题解,可是我不会求割边只能暴力判割边了QAQ 所以,本文介绍求割边(又称桥). 的定义同求有向图强连通分量. 枚举当前点的所有邻接点: 1.如果某个邻接点未被访问过,则访 ...

  5. [Tarjan 学习笔记](无向图)

    今天考试因为不会敲 Dcc 的板子导致没有AK(还不是你太菜了),所以特地写一篇博客记录 Tarjan 的各种算法 无向图的割点与桥 (各种定义跳过) 割边判定法则 无向边 (x,y) 是桥,当且仅当 ...

  6. Tarjan学习笔记

    \(Tarjan\)是个很神奇的算法. 给一张有向图,将其分解成强连通分量们. 强连通分量的定义:一个点集,使得里面的点两两可以互相到达,并且再加上另一个点都无法满足强连通性. \(Tarjan\)的 ...

  7. Tarjan/2-SAT学习笔记

    Tarjan/2-SAT Tags:图论 作业部落 评论地址 Tarjan 用来求割边或者割点,求点双联通分量或者边双联通分量 点双联通分量:两个点之间有两条点不相交的路径 边双联通分量:两个点之间有 ...

  8. 强连通分量(Korasaju & Tarjan)学习笔记

    好久以前学过的东西...现在已经全忘了 很多图论问题需要用到强连通分量,还是很有必要重新学一遍的 强连通分量(Strongly Connected Component / SCC) 指在一个有向图中, ...

  9. 算法笔记_146:TarJan算法的应用(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M& ...

随机推荐

  1. php 数组对象之间的转换

    在之前我写过php返回json数据简单实例 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 ...

  2. 复习HTML+CSS(3)

    n  超级链接 l  语法格式:<a 属性 = "值">---</a> l  常用属性: n  Href:目标文件的地址URL,该URL可以是相对地址,也可 ...

  3. Lua中table的实现-《Lua设计与实现》

    本文来自<Lua设计与实现>的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈   Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组 ...

  4. js的处理技巧

    目前来说,处理js有两种方法: 1,通过第三方工具执行js脚本, selenium,会驱动浏览器把js全部加载出来并返回. 2,手动模拟js的执行 2.1)找到js链接,可以在idle中用print( ...

  5. scrapy spider官方文档

    Spiders Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...

  6. 初入HTML5

    在最开始接触HTML5的时候,你会遇到的大多是一些常见常用的属性以及属性值.它们分类广.品种杂且使用率高.到css各种样式的时候,你会接触到更多的东西,各种属性.选择器.盒子模型都是重点.那么,现在我 ...

  7. 小工具:批量导入导出主机上的docker镜像

    工作需要,将主机上的部分镜像导出为tar文件,放便在其他主机上使用 用python实现了一个批量打包脚本: import re import os import subprocess if __nam ...

  8. 【微信小程序】对微信http请求API的封装,方便对错误码进行处理

    /**   * App 微信配置文件app.js   * author: nujey   * versions: 1.0.0   */   App({   /**   * @param {Object ...

  9. Java图形界面学习---------简易登录界面

    /** * @author Administrator * Java图形界面学习---------简易登录界面 * date:2015/10/31 */ import java.awt.BorderL ...

  10. [LeetCode] Stickers to Spell Word 贴片拼单词

    We are given N different types of stickers. Each sticker has a lowercase English word on it. You wou ...