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算法缩点处理 ...
随机推荐
- java调用js代码
jdk8里使用脚本引擎调用js 1.定义一个js方法: function getRouteInfo(province){ //注意,参数不要带var..在java里执行会报错.. if (provin ...
- 【Oracle】oracle pctfree和pctused详解
oracle pctfree和pctused详解 一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数 ...
- 敏捷史话(四):敏捷是人的天性 —— Arie van Bennekum
敏捷是人的天性,是你与生俱来的东西.面对敏捷,Arie van Bennekum 下了这样一个结论. 但这并不意味着人们只能通过天赋获得敏捷,对于想要学习敏捷的人来说,敏捷绝不是仅仅靠学习僵化的框架. ...
- eNSP启动设备AR1失败记一次解决步骤
eNSP稳定版本下载: 微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...
- The router relies on a tree structure which makes heavy use of common prefixes, it is basically a compact prefix tree (or just Radix tree).
https://github.com/julienschmidt/httprouter/
- etcd 性能优化实践
https://mp.weixin.qq.com/s/lD2b-DZyvRJ3qWqmlvHpxg 从零开始入门 K8s | etcd 性能优化实践 原创 陈星宇 阿里巴巴云原生 2019-12-16 ...
- 腾讯libco协程原理
https://blog.csdn.net/GreyBtfly/article/details/83688420 堆栈 https://blog.csdn.net/lqt641/article/det ...
- libco协程原理简要分析
此文简要分析一下libco协程的关键原理. 在分析前,先简单过一些协程的概念,以免有新手误读了此篇文章. 协程是用户态执行单元,它的创建,执行,上下文切换,挂起,销毁都是在用户态中完成,对linux系 ...
- LOJ10098
USACO 2006 Jan. Gold 为了从F个草场中的一个走到另一个,贝茜和她的同伴们不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会 ...
- LOJ10067
LOJ10067 构造完全图 给你一棵树 T,找出 T 能扩展出的边权和最小的完全图 G. 第一行 N 表示树 T 的点数: 保证输入数据构成一棵树. 输出仅一个数,表示最小的完全图 G 的边权和. ...