【BZOJ】【1051】【HAOI2005】受欢迎的牛

按B->A连边,tarjan缩点,然后找入度为0的连通分量,如果有1个,则ans=size[i],如果大于一个则ans=0;

当然如果按A->B连边就是找出度为0的(表示没有被它喜欢的,这样的连通分量才有可能所被所有的喜欢)

 1 /**************************************************************
 2     Problem: 1051
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:52 ms
 7     Memory:2308 kb
 8 ****************************************************************/
 9
10 //BZOJ 1051
11 #include<vector>
12 #include<cstdio>
13 #include<cstring>
14 #include<cstdlib>
15 #include<iostream>
16 #include<algorithm>
17 #define rep(i,n) for(int i=0;i<n;++i)
18 #define F(i,j,n) for(int i=j;i<=n;++i)
19 #define D(i,j,n) for(int i=j;i>=n;--i)
20 using namespace std;
21 const int N=10086;
22
23 void read(int &v){
24     v=0;int sign=1; char ch=getchar();
25     while(ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) sign=-1; ch=getchar();}
26     while(ch>=‘0‘&&ch<=‘9‘){v=v*10+ch-‘0‘; ch=getchar();}
27     v*=sign;
28 }
29 /****************tamplate***********************/
30 int n,m;
31 int head[N],to[N*5],next[N*5],cnt;
32 void add(int a,int b){
33     to[++cnt]=b; next[cnt]=head[a]; head[a]=cnt;
34 }
35 int dfn[N],low[N],belong[N],du[N],dfs_clock,size[N],SCC;
36 bool inst[N];
37 int st[N],top;
38 void tarjan(int x){
39     int y;
40     dfn[x]=low[x]=++dfs_clock;
41     st[top++]=x;
42     inst[x]=1;
43     for(int i=head[x];i;i=next[i]){
44         y=to[i];
45         if (!dfn[y]){
46             tarjan(y);
47             low[x]=min(low[x],low[y]);
48         }
49         else if (inst[y]) low[x]=min(low[x],dfn[y]);
50     }
51     if (dfn[x]==low[x]){
52         SCC++;size[SCC]=0;
53         for(y=0;y!=x;){
54             y=st[--top];
55             inst[y]=0;
56             belong[y]=SCC;
57             size[SCC]++;
58         }
59     }
60 }
61 void rebuild(){
62     F(x,1,n)
63         for(int i=head[x];i;i=next[i])
64             if (belong[x]!=belong[to[i]]) du[belong[to[i]]]++;
65 }
66 /***********************************************/
67 int main(){
68     read(n); read(m);
69     int a,b;
70     F(i,1,m){
71         read(a); read(b);
72         add(b,a);
73     }
74     F(i,1,n) if (!dfn[i]) tarjan(i);
75     rebuild();
76     int ans=0;
77     if (SCC==1) ans=n;
78     else{
79         int tot=0;
80         F(i,1,SCC) if (du[i]==0) {tot++; ans=size[i];}
81         if (tot>1) ans=0;
82     }
83     printf("%d\n",ans);
84     return 0;
85 }

时间: 2024-12-28 17:55:30

【BZOJ】【1051】【HAOI2005】受欢迎的牛的相关文章

BZOJ 1051 最受欢迎的牛 解题报告

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

bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点

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

bzoj 1051 (强连通) 受欢迎的牛

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

洛谷 P2341 BZOJ 1051 [HAOI2006]受欢迎的牛

题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C.牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你 算出有多少头奶牛可以当明星. 输入输出格式 输入格式: ? 第一行:两个用空格分开的整数:N和M ? 第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B 输出格式: ? 第一行:单独一个整数,表示明星奶牛的数量 输入输出样

BZOJ 1051: [HAOI2006]受欢迎的牛

Description 一个有向图,求所以能被别的点到达的点的个数. Sol Tarjan + 强连通分量 + 缩点. 缩点以后找强连通分量,缩点,然后当图有且仅有1个出度为1的点时,有答案. Code /************************************************************** Problem: 1051 User: BeiYu Language: C++ Result: Accepted Time:76 ms Memory:3048 kb *

BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问到所有的点. 代码: #include<iostream> #include<cstdio> #include<vector> #include<stack> #include<algorithm> #include<cstring> u

1051: [HAOI2006]受欢迎的牛

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

【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

【tarjan】BZOJ 1051:受欢迎的牛

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

【强连通分量】bzoj 1051 受欢迎的牛

1051: [HAOI2006]受欢迎的牛 时间限制: 10 Sec  内存限制: 162 MB提交: 2150  解决: 1129[提交][] 题目描述 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头牛被所有的牛认为是受欢迎的. 输入 第一行两个数N,M. 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重