受欢迎的牛 [HAOI2006] [强连通] [传递闭包(划)]
Description
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛 A 认为牛 B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。
Input
第1行两个整数N,M;
接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)
Output
一个数,即有多少头牛被所有的牛认为是受欢迎的。
Sample Input
3 3
1 2
2 1
2 3
Sample Output
1
Hint
10%的数据N<=20,M<=50
30%的数据N<=1000,M<=20000
70%的数据N<=5000,M<=50000
100%的数据N<=10000,M<=50000
Solution
首先,如果数据很小的话可以用传递闭包对吧,但是N到了1e5就显然不行了。
显然如果在一个环里的各个点的传递是互达的,由此我们可以扩展到一个强连通分量也是这样。
于是我们就可以想到tarjan缩点。
缩完点后怎么办呢?愚蠢的我想到一个点的入度=点数-1就对答案产生贡献,显然是不对的(如 3->2->1)。
于是我第一遍只有70分,(这样都有70分可能是数据太水了)。
脑子不好使的我冒着被卡的风险在缩完点后使用传递闭包(不要问我为什么我这么喜欢传递闭包),居然过了!(可能是数据太水了)
然后我便看正解,发现果然还是大佬们聪明一点。
对于缩完点后的点x
i)如果出度!=0,那么肯定有没指向自己的点,(如果有指出去后又指回来肯定在连通分量内)
ii)如果出度==0,似乎这个连通分量内的点就是答案,但是如果有多个出度为0的点,就说明还有多个独立的区域,那也不行。
所以出度==0的点有且只有一个的时候即为答案
Code (传递闭包版)
#include<set>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
#define inf (1<<30)
#define maxn 10005
#define maxm 500005
#define add(x,y) e[++cnt].u=u,e[cnt].v=v,e[cnt].next=head[u],head[u]=cnt
using namespace std;
stack<int> stk;
set<int> st[maxn];
int n,m,cnt,id,sid,ans;
int head[maxn],scc[maxn],dfn[maxn],low[maxn],vis[maxn],ind[maxn],sz[maxn],oud[maxn];
int gra[][];
struct E{
int u,v,next;
}e[maxm];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void tarjan(int u,int fa)
{
low[u]=dfn[u]=++id;
stk.push(u);vis[u]=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(!dfn[v])
{
tarjan(v,u);low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++sid;int x;
do{
x=stk.top(),stk.pop();
vis[x]=,scc[x]=sid,sz[sid]++;
}while(x!=u);
}
} int main()
{
n=read(),m=read();
RG u,v;rep(i,,m) u=read(),v=read(),add(u,v);
rep(i,,n) if(!scc[i]) tarjan(i,);
rep(i,,cnt)
{
int x=scc[e[i].u],y=scc[e[i].v];
if(x!=y)
gra[x][y]=;
}
rep(k,,sid)
rep(i,,sid)
rep(j,,sid)
if(gra[i][k]&&gra[k][j])gra[i][j]=;
rep(i,,sid)
{
int flg=;
rep(j,,sid)
if(i!=j&&!gra[j][i]) flg=;
if(!flg) ans+=sz[i];
}
cout<<ans;
return ;
}
>>点击查看代码<<
#include<set>
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;i++)
#define per(i,a,b) for(RG i=a;i>=b;i--)
#define inf (1<<30)
#define maxn 10005
#define maxm 500005
#define add(x,y) e[++cnt].u=u,e[cnt].v=v,e[cnt].next=head[u],head[u]=cnt
using namespace std;
stack<int> stk;
set<int> st[maxn];
int n,m,cnt,ccnt,id,sid,ans;
int head[maxn],hh[maxn],scc[maxn],dfn[maxn],low[maxn],vis[maxn],ind[maxn],sz[maxn],oud[maxn];
int gra[][];
struct E{
int u,v,next;
}e[maxm];
struct EE{
int v,next;
}edge[maxm];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void tarjan(int u,int fa)
{
low[u]=dfn[u]=++id;
stk.push(u);vis[u]=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(!dfn[v])
{
tarjan(v,u);low[u]=min(low[u],low[v]);
}
else if(vis[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
++sid;int x;
do{
x=stk.top(),stk.pop();
vis[x]=,scc[x]=sid,sz[sid]++;
}while(x!=u);
}
} int main()
{
n=read(),m=read();
RG u,v;rep(i,,m) u=read(),v=read(),add(u,v);
rep(i,,n) if(!scc[i]) tarjan(i,);
rep(i,,cnt)
{
int x=scc[e[i].u],y=scc[e[i].v];
if(x!=y)
gra[x][y]=;
}
rep(k,,sid)
rep(i,,sid)
rep(j,,sid)
if(gra[i][k]&&gra[k][j])gra[i][j]=;
rep(i,,sid)
{
int flg=;
rep(j,,sid)
if(i!=j&&!gra[j][i]) flg=;
if(!flg) ans+=sz[i];
}
cout<<ans;
return ;
受欢迎的牛 [HAOI2006] [强连通] [传递闭包(划)]的更多相关文章
- BZOJ 1051:[HAOI2006]受欢迎的牛(强连通分量)
受欢迎的牛Description每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么 ...
- 1051. [HAOI2006]受欢迎的牛【强连通分量】
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...
- 受欢迎的牛[HAOI2006]
--BZOJ1051 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎, ...
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
- 【题解】洛谷P2341 [HAOI2006]受欢迎的牛(强连通分量)
洛谷P2341:https://www.luogu.org/problemnew/show/P2341 前言 这题看错题目 足足花了将近5小时提交了15次 在一位dalao的提醒下才AC了 记得要看清 ...
- 【BZOJ1051】1051: [HAOI2006]受欢迎的牛 tarjan求强连通分量+缩点
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
- 【强连通分量】Bzoj1051 HAOI2006 受欢迎的牛
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认 ...
- 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...
- bzoj1051 [HAOI2006]受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4773 Solved: 2541[Submit][Sta ...
随机推荐
- OpenCV-Python入门教程2-打开摄像头
一.打开摄像头 import cv2 # 打开摄像头并灰度化显示 capture = cv2.VideoCapture(0) while(True): # 获取一帧 ret, frame = capt ...
- vetur插件提示 [vue-language-server] Elements in iteration expect to have 'v-bind:key' directives错误的解决办法
错误提示: [vue-language-server] Elements in iteration expect to have 'v-bind:key' directives.Renders the ...
- 设置git记住用户和密码
git config --global credential.helper store
- zeromq的安装,部署(号称最快的消息队列,消息中间件)
1:Storm作为一个实时处理的框架,产生的消息需要快速的进行处理,比如存在消息队列ZeroMQ里面. 由于消息队列ZeroMQ是C++写的,而我们的程序是运行在JVM虚拟机里面的.所以需要jzmq这 ...
- 一脸懵逼学习HBase---基于HDFS实现的。(Hadoop的数据库,分布式的,大数据量的,随机的,实时的,非关系型数据库)
1:HBase官网网址:http://hbase.apache.org/ 2:HBase表结构:建表时,不需要指定表中的字段,只需要指定若干个列族,插入数据时,列族中可以存储任意多个列(即KEY-VA ...
- MySql中Week()函数的用法
WEEK(date[,mode]):该函数返回日期的星期数 模式 星期的第一天 范围 星期 1 是第一天 0 Sunday 0-53 一年中多一个星期天 1 Monday 0-53 一年多3天 2 S ...
- 带你了解zabbix整合ELK收集系统异常日志触发告警~
今天来了解一下关于ELK的“L”-Logstash,没错,就是这个神奇小组件,我们都知道,它是ELK不可缺少的组件,完成了输入(input),过滤(fileter),output(输出)工作量,也是我 ...
- Vue全局API总结
1.extend用于创建一个子类Vue,用$mount来挂载 <body> <div id="app"></div> <script> ...
- 使用Phar来打包发布PHP程序
简单来说,Phar就是把Java界的jar概念移植到了PHP界. Phar可以将一组PHP文件进行打包,还可以创建默认执行的stub(或者叫做 bootstrap loader),Phar可以选择是否 ...
- 阿里巴巴Java开发规范手册
Java开发手册 版本号 制定团队 更新日期 备 注 1.0.0 阿里巴巴集团技术部 2016.12.7 首次向Java业界公开 一.编程规约 (一) 命名规约 1. [强制]所有编程相关命 ...