poj2186 强连通

题意:有 n 头牛,以及一些喜欢关系,牛 A 喜欢牛 B,这种关系可以传递,问有多少头牛被牧场上所有牛喜欢。

首先强连通,因为在同一个强连通分量中牛是等价的,然后对于一个有向无环图看是否只有一个强连通分量出度为 0 ,如果是,则这个强连通分量中的点都是答案,否则为 0。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stack>
 4 #include<queue>
 5 using namespace std;
 6
 7 const int maxn=10005;
 8 const int maxm=50005;
 9
10 int head[maxn],point[maxm],nxt[maxm],size;
11 int n,t,scccnt;
12 int stx[maxn],low[maxn],scc[maxn],od[maxn];
13 stack<int>S;
14
15 void init(){
16     memset(head,-1,sizeof(head));
17     size=0;
18     memset(od,0,sizeof(od));
19 }
20
21 void add(int a,int b){
22     point[size]=b;
23     nxt[size]=head[a];
24     head[a]=size++;
25 }
26
27 void dfs(int s){
28     stx[s]=low[s]=++t;
29     S.push(s);
30     for(int i=head[s];~i;i=nxt[i]){
31         int j=point[i];
32         if(!stx[j]){
33             dfs(j);
34             low[s]=min(low[s],low[j]);
35         }
36         else if(!scc[j]){
37             low[s]=min(low[s],stx[j]);
38         }
39     }
40     if(low[s]==stx[s]){
41         scccnt++;
42         while(1){
43             int u=S.top();S.pop();
44             scc[u]=scccnt;
45             if(s==u)break;
46         }
47     }
48 }
49
50 void setscc(){
51     memset(stx,0,sizeof(stx));
52     memset(scc,0,sizeof(scc));
53     t=scccnt=0;
54     for(int i=1;i<=n;++i)if(!stx[i])dfs(i);
55     for(int i=1;i<=n;++i){
56         for(int j=head[i];~j;j=nxt[j]){
57             int k=point[j];
58             if(scc[i]!=scc[k]){
59                 od[scc[i]]++;
60             }
61         }
62     }
63 }
64
65 int main(){
66     int m;
67     while(scanf("%d%d",&n,&m)!=EOF){
68     init();
69     while(m--){
70         int a,b;
71         scanf("%d%d",&a,&b);
72         add(a,b);
73     }
74     setscc();
75     int ans=0;
76     if(scccnt==1)printf("%d\n",n);
77     else{
78         for(int i=1;i<=scccnt;++i)if(!od[i])ans++;
79         if(ans!=1){
80             printf("0\n");
81         }
82         else{
83             ans=0;
84             for(int i=1;i<=n;++i){
85                 if(!od[scc[i]])ans++;
86             }
87             printf("%d\n",ans);
88         }
89     }
90     }
91     return 0;
92 }

时间: 2024-10-13 20:36:32

poj2186 强连通的相关文章

poj2186 强连通缩点

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29141   Accepted: 11779 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &

poj2186 强连通分量 targan算法的应用

这个题的意思是给你一些牛和一些边, 假设A 膜拜 B, B膜拜C, 那么A就膜拜C, 然后让你求被其他所有的牛都膜拜的牛的个数, 使用targan算法缩点, 将图变成有向无环图DAG 之后统计顶点的入度, 假设顶点入度为0的个数超过了1, 那么答案是0, 否则输出这个集合的牛的数量. 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using

poj2186 Popular Cows --- 强连通

给一个有向图,问有多少结点是其他所有结点都可以到达的. 等价于,在一个有向无环图上,找出度为0 的结点,如果出度为0的结点只有一个,那么这个就是答案,如果大于1个,则答案是0. 这题有环,所以先缩点.求唯一出度为0的强连通分量. #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<iostream> #define inf 0x3f3f3f3f

强连通分量tarjan缩点——POJ2186 Popular Cows

这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定意味着v可达u.    相互可达则属于同一个强连通分量    (Strongly Connected Component, SCC) §有向图和它的转置的强连通分量相同 §所有SCC构成一个DAG(有向无环图) dfn[u]为节点u搜索的次序编号(时间戳),即首次访问u的时间 low[u]为u或u的

强连通分量+poj2186

强连通分量:两个点能够互相连通. 算法分解:第一步.正向dfs全部顶点,并后序遍历 第二步,将边反向,从最大边dfs,构成强连通分量 标号最大的节点属于DAG头部,cmp存一个强连通分量的拓扑序. poj2186 解就是拓扑后的最后一个强连通分量 #include<cstdio> #include<algorithm> #include<vector> #include<iostream> #include<cstring> #include&l

POJ2186 Popular Cows 【强连通分量Kosaraju】

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &l

POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】

Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 23445   Accepted: 9605 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M &l

POJ2186 Popular Cows【Kosaraju】【强连通分量】

Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24266Accepted: 9954 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M <= 5

[POJ2186]Popular Cows(强连通分量)

题目链接:http://poj.org/problem?id=2186 给定n个点m条边,求某点使得其他点都有通向它的一条路径,计算这个点集的大小. 强连通分解后求出度为0的连通分量的个数,如果有且仅有一个连通分量出度为1,则统计这个连通分量中点的数目. 遍历所有点的出边指向的点,判断这两个点是否属于同一个连通分量,记录每个连通分量中的点的数目. 1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip&