POJ - 2553 tarjan算法+缩点
题意:
给你n个点,和m条单向边,问你有多少点满足(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}关系,并把这些点输出(要注意的是这个关系中是蕴含关系而不是且(&&)关系)
题解:
单独一个强连通分量中的所有点是满足题目要求的
但如果它连出去到了其他点那里,要么成为新的强连通分量,要么失去原有的符合题目要求的性质
所以只需tarjan缩点求出所有强连通分量,再O(E)枚举所有边,是否会成为连接一个分量与另一个分量的边——即一条出度——即可
如果一个分量没有出度,那么他中间的所有点都是符合题目要求的点
代码(多组输入记得每次初始化):
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 #include<map>
7 #include<vector>
8 #include<math.h>
9 #define mem(a,x) memset(a,x,sizeof(a))
10 using namespace std;
11 const int maxn=50005;
12 const int mod=26;
13 const int INF=0x3f3f3f3f;
14 struct edge
15 {
16 int u,v,next;
17 bool sign;
18 } e[maxn*2];
19 int head[maxn],cnt;
20 void add_edge(int x,int y)
21 {
22 e[cnt].u=x;
23 e[cnt].v=y;
24 e[cnt].next=head[x];
25 head[x]=cnt++;
26 }
27 int dfn[maxn],low[maxn],stacks[maxn],top,tot;
28 int taj;
29 int belong[maxn],visit[maxn],result[maxn];
30 vector<int>w[maxn];
31 void tarjan(int x,int fx)
32 {
33 dfn[x]=low[x]=++tot;
34 stacks[top++]=x;
35 visit[x]=1;
36 for(int i=head[x]; i!=-1; i=e[i].next)
37 {
38 int v=e[i].v;
39 if(!dfn[v])
40 {
41 tarjan(v,x);
42 low[x]=min(low[x],low[v]);
43 if(dfn[x]<low[v])
44 {
45 e[i].sign=1;
46 }
47 }
48 else if(visit[v])
49 {
50 low[x]=min(low[x],dfn[v]);
51 }
52 }
53 if(low[x]==dfn[x])
54 {
55 int now;
56 taj++;
57 w[taj].clear();
58 do
59 {
60 now=stacks[--top];
61 visit[now]=0;
62 belong[now]=taj;
63 w[taj].push_back(now);
64 }
65 while(now!=x);
66 }
67 }
68 void tarjan_init(int n)
69 {
70 memset(visit,0,sizeof(visit));
71 memset(low,0,sizeof (low));
72 memset(dfn,0,sizeof (dfn));
73 memset(stacks,0,sizeof (stacks));
74 memset(belong,0,sizeof belong);
75 top=tot=taj=0;
76 for(int i=1; i<=n; ++i)
77 {
78 if(!dfn[i]) tarjan(i,i);
79 }
80 }
81 vector<int>g[maxn];
82 int cu[maxn],ru[maxn];
83 void suodian()
84 {
85 memset(cu,0,sizeof(cu));
86 memset(ru,0,sizeof(ru));
87 for(int i=1; i<=taj; ++i)
88 g[i].clear();
89 for(int i=0; i<cnt; ++i)
90 {
91 int u=belong[e[i].u];
92 int v=belong[e[i].v];
93 if(u!=v) g[u].push_back(v),cu[u]++,ru[v]++;//printf("%d %d\n",u,v);
94 }
95 }
96 int vis[maxn];
97 void init()
98 {
99 memset(head,-1,sizeof(head));
100 cnt=0;
101 }
102 int main()
103 {
104 int n,m;
105 while(~scanf("%d",&n))
106 {
107 if(n==0) return 0;
108 scanf("%d",&m);
109 init();
110 for(int i=1; i<=m; ++i)
111 {
112 int a,b;
113 scanf("%d%d",&a,&b);
114 add_edge(a,b);
115 }
116 tarjan_init(n);
117 suodian();
118 int index=0;
119 for(int i=1;i<=n;++i)
120 {
121 if(cu[belong[i]]==0)
122 result[index++]=i;
123 }
124 if(index==0)
125 {
126 printf("\n");
127 continue;
128 }
129 sort(result,result+index);
130 for(int i=0;i<index;++i)
131 if(i==index-1)
132 printf("%d\n",result[i]);
133 else printf("%d ",result[i]);
134 }
135 return 0;
136 }
POJ - 2553 tarjan算法+缩点的更多相关文章
- tarjan算法+缩点--cojs 908. 校园网
cojs 908. 校园网 ★★ 输入文件:schlnet.in 输出文件:schlnet.out 简单对比时间限制:1 s 内存限制:128 MB USACO/schlnet(译 b ...
- POJ 1470 Tarjan算法
裸的LCA,读入小坑.Tarjan算法大坑,一开始不知道哪儿错了,后来才发现,是vis数组忘了清零了(⊙﹏⊙)b 傻傻的用了邻接矩阵...很慢啊,1100多ms. Closest Common Anc ...
- tarjan算法+缩点:求强连通分量 POJ 2186
强连通分量:1309. [HAOI2006]受欢迎的牛 ★★ 输入文件:cow.in 输出文件:cow.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 每一头牛 ...
- POJ 1236 Network of Schools (tarjan算法+缩点)
思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...
- POJ 2553 Tarjan
题意:如果v点能到的所有点反过来又能到v点,则v点是sink点,排序后输出所有的sink点. 思路:Tarjan缩点,输出所有出度为0的连通块内的点. PS:一定要记得把数组清零!!!!!!!否则自己 ...
- poj 2553 强连通分支与缩点
思路:将所有强连通分支找出来,并进行缩点,然后找其中所有出度为0的连通分支,就是题目要求的. #include<iostream> #include<cstdio> #incl ...
- POJ 1236 Tarjan算法
这道题认真想了想.. [ 题目大意:有N个学校,从每个学校都能从一个单向网络到另外一个学校,两个问题 1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件. 2:至少需要添加几条 ...
- tarjan算法(求强连通子块,缩点)
tarjan算法求图中的强连通子图的个数. #include<iostream> #include<stack> #include<queue> #include& ...
- poj2186tarjan算法缩点求出度
poj2186tarjan算法缩点求出度 自己打一遍第一题,入门啦,入门啦 题目还算简单,多头牛,给你仰慕关系(可传递),问你最后有没有牛被所有的牛仰慕 根据关系可以建图,利用tarjan算法缩点处理 ...
随机推荐
- 在Linux系统下限制指定目录的大小以及文件/文件夹数量
背景说明 在Linux操作系统下有时需要限制一个指定文件夹的大小和文件夹内可存储的文件数量,有可能是出于安全的考量或者定制化的配置,这里我们提供了一种方案:用dd创建一个空的img镜像,进行格式化的配 ...
- 有了链路日志增强,排查Bug小意思啦!
在工作中,相信大家最怕的一件事就是听到有人在工作群艾特你:某某功能报错啦... 然后你就得屁颠屁颠的去服务器看日志,日志量少还好点,多的话找起来太麻烦了.不太容易直接定位到关键地方. 东找找西找找,好 ...
- python optparse模块的用法
引用原博主文章链接: https://www.cnblogs.com/darkpig/p/5717902.html
- 与图论的邂逅07:K短路
在做最短路的题时我们不免会碰到许多求次短路的题,然而我们也能很快地想到解决的办法: 用dijkstra跑一遍最短路,当终点第二次被取出时就是次短路了.时间复杂度为O((N+M)logN).实际上前面得 ...
- 低功耗降线性稳压器,24V转5V降压芯片
PW2330开发了一种高效率的同步降压DC-DC变换器3A输出电流.PW2330在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导 损失.PW2330 ...
- uni-app调用wifi接口
微信小程序条件渲染 在小程序app.json中添加 需要先获取位置信息 "permission": { "scope.userLocation": { &quo ...
- 并发编程常用工具类(一) countDownLatch和cyclicBarrier的使用对比
1.CountDownLatch countDownLatch的作用是让一组线程等待其他线程完成工作以后在执行,相当于加强版的join(不懂可以百度一下join的用法),一般在初始 ...
- 封装JSONP 函数,方便请求发送
封装JSONP 函数,方便请求发送 封装jsonp的代码和封装Ajax的代码非常的相似!可以参照食用偶! <button id="btn">点击我发送请求!</b ...
- 【Soul网关探秘】http数据同步-Admin通知前处理
引言 本篇开始研究 Soul 网关 http 数据同步,将分为三篇进行分析: <Admin通知前处理> <变更通知机制> <Bootstrap处理变更通知> 希望三 ...
- Spring整合SpringMVC + Mybatis基础框架的配置文件
目录 前言 1. Mybatis层编写 2. Spring层编写 1. Spring整合Mybatis 2. Spring整合service 3. SpringMVC层编写 1. 编写web.xml ...