bzoj1051

这道就是明星奶牛,A了一次又一次了,(⊙o⊙)…(⊙o⊙)…

去年pas就打了不下5次,就是强联通缩点,然后求出度为0的块

判断有多个的话就无解,一个就输出块的大小。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7
 8 const int NN=1e4+7,MM=NN*5;
 9
10 int n,m,Time=0,top=0,scc=0,ans;
11 int dfn[NN],low[NN],instack[NN],q[NN],belong[NN],chu[NN];
12 int cnt=0,head[NN],next[MM],rea[MM],skt[NN];
13
14 void add(int u,int v)
15 {
16     cnt++;
17     next[cnt]=head[u];
18     head[u]=cnt;
19     rea[cnt]=v;
20 }
21 void tarjan(int u)
22 {
23     low[u]=dfn[u]=++Time;
24     q[++top]=u,instack[u]=1;
25     for (int i=head[u];i!=-1;i=next[i])
26     {
27         int v=rea[i];
28         if (dfn[v]==0)
29         {
30             tarjan(v);
31             low[u]=min(low[v],low[u]);
32         }
33         else if (instack[v]) low[u]=min(low[u],dfn[v]);
34     }
35     if (low[u]==dfn[u])
36     {
37         scc++;
38         int x=-1;
39         while (x!=u)
40         {
41             x=q[top--];
42             instack[x]=0;
43             belong[x]=scc;
44             ++skt[scc];
45         }
46     }
47 }
48 void rebuild()
49 {
50     for (int u=1;u<=n;u++)
51     {
52         for (int i=head[u];i!=-1;i=next[i])
53         {
54             int v=rea[i];
55             if (belong[u]!=belong[v]) chu[belong[u]]=1;
56         }
57     }
58     int num=0,x=0;
59     for (int i=1;i<=scc;i++)
60         if (chu[i]==0) num++,x=i;
61     if (num!=1) ans=0;
62     else ans=skt[x];
63     printf("%d",ans);
64 }
65 int main()
66 {
67     scanf("%d%d",&n,&m);
68     int x,y;
69     memset(head,-1,sizeof(head));
70     for (int i=1;i<=m;i++)
71     {
72         scanf("%d%d",&x,&y);
73         add(x,y);
74     }
75     for (int i=1;i<=n;i++)
76         if (dfn[i]==0) tarjan(i);
77     rebuild();
78 }
时间: 2024-08-03 07:30:06

bzoj1051的相关文章

【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数

[bzoj1051] [HAOI2006]受欢迎的牛 2014年1月8日7450 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. Input 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B) Output

bzoj1051【HAOI2006】受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3491  Solved: 1837 [Submit][Status][Discuss] Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. I

[BZOJ1051] [HAOI2006] 受欢迎的牛 (强联通分量)

Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头 牛被所有的牛认为是受欢迎的. Input 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可 能出现多个A,B) Output 一个数,即有多少头牛被所有的牛认为是受欢迎的. Sample Input 3

【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点

Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. Input 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B) Output 一个数,即有多少头牛被所有的牛认为是受欢迎的. Sample Input 3 3

【强连通分量】Bzoj1051 HAOI2006 受欢迎的牛

Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. Solution 那么对于x如果可以也就是所有节点都可以到达x,如果无环也就是x要无出度且无出度的点数正好为1(出边连点必到不了x). 然而这是有环的,那么把强连通分量缩起来就行了. Code 我这个傻逼现在才会求强连通分量. 而且还

bzoj1051 [HAOI2006]受欢迎的牛

1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头 牛被所有的牛认为是受欢迎的. Input 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可

bzoj1051题解

[题意分析] 给你一张有向图,求有多少个点,满足以其他任意一点为起点都能到达该点. [解题思路] 如果这张有向图不连通,则一定没有点能被其他所有点到达,答案为0. 然后先用tarjan缩一波强连通分量,因为每个强连通分量中任意两点能相互到达,所以整体可以看成一个点. 因为已经保证图的连通性,所以只要统计没有入度的强连通分量的点数和即可.复杂度O(n+m). [参考代码] 1 #include <cctype> 2 #include <cstdio> 3 #define REP(I,

【BZOJ1051】受欢迎的牛

强连通分量: 首先tarjan缩点重构图 之后,若出度为0的点仅有一个,那么答案即为该点代表的强连通分量中点的个数 否则,答案为0 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=10010,M=50010; 5 const int novis=-1,over=1,nowvis=0; 6 int size,head[M],next[M],to[M]; 7 int head2[M]

BZOJ1051|HAOI2006受欢迎的牛|强连通分量

Description每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的.Input第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)Output一个数,即有多少头牛被所有的牛认为是受欢迎的.Sample Input3 31 22 12