题面

传送门:https://www.luogu.org/problemnew/show/P2341


Solution

前排提示,本蒟蒻做法既奇葩又麻烦

我们先可以把题目转换一下。

可以把一头牛喜欢另外一头牛理解为另外一头牛被一头牛喜欢。

我们把被喜欢的关系建边,即B被A喜欢,从B向A连一条有向边

显然,一个点若能到达其他所有节点,它就是题目中的明星牛。

接下来,我们可以考虑一个类似于DP的做法。

一个点能访问到的点,等同于它的儿子们访问的到的点加上它自己

显然,这种特性要在DAG(有向无环图)上才能方便的使用。

所以说,我们第一步要对题目做的是缩点。

缩完点之后,我们就可以进行图上DP了。

我们可以用一个01数组f[i][j]表示i能具体能到达的点为j(用010101数列表示)。

显然 f[i] |= f[k] (或运算)(k为i直接相连的点)

答案为f[i][j] j=11111111.... 的点

当然,这样做有一个问题。

点的最大数目为n,我们这样做是O(n^2)的,在最坏条件(没有一个点能缩在一起)的情况下,会T。

我们这时候就得请出bitset。

bitset的食用方法:https://www.cnblogs.com/RabbitHu/p/bitset.html(借用胡小兔dalao的博客)

使用bitset后,我们计算一个点能到达其他的点的复杂度一下子降为了O(n/32)

总复杂度为O(n^2/32) 

然后就可以过啦。


Code

//Luogu P2341 [HAOI2006]受欢迎的牛
//June,5th,2018
//缩点+(完全没必要的)bitset
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<bitset>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=10000+100;
vector <int> e[N],e2[N];
int n,m,belong[N],nd_tot,dfn[N],mcount,low[N],cnt[N];
bool InStack[N];
stack <int> s;
bitset <N> arrival[N];
void Tarjan(int now)
{
InStack[now]=true;
s.push(now);
dfn[now]=low[now]=++mcount;
for(int i=0;i<int(e[now].size());i++)
if(dfn[e[now][i]]==0)
{
Tarjan(e[now][i]);
low[now]=min(low[now],low[e[now][i]]);
}
else if(InStack[e[now][i]]==true)
low[now]=min(low[now],low[e[now][i]]);
if(low[now]==dfn[now])
{
nd_tot++;
while(s.empty()==false)
{
int temp=s.top();
s.pop();
InStack[temp]=false;
belong[temp]=nd_tot;
cnt[nd_tot]++;
if(temp==now) break;
}
arrival[nd_tot][nd_tot]=true;
}
}
bool vis[N];
int ans=0;
void dfs(int now)
{
vis[now]=true;
for(int i=0;i<int(e2[now].size());i++)
{
if(vis[e2[now][i]]==false)
dfs(e2[now][i]);
arrival[now]|=arrival[e2[now][i]];
}
if(int(arrival[now].count())==nd_tot)
ans+=cnt[now];
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
e2[i].reserve(4),
e[i].reserve(4);
for(int i=1;i<=m;i++)
{
int s=read(),t=read();
e[t].push_back(s);
} for(int i=1;i<=n;i++)
if(dfn[i]==0)
Tarjan(i);
for(int i=1;i<=n;i++)
for(int j=0;j<int(e[i].size());j++)
if(belong[i]!=belong[e[i][j]])
e2[belong[i]].push_back(belong[e[i][j]]);
for(int i=1;i<=nd_tot;i++)
if(vis[i]==false)
dfs(i); printf("%d",ans);
return 0;
}

正解(C++)

[Luogu P2341] [HAOI2006]受欢迎的牛 (缩点+bitset)的更多相关文章

  1. Luogu P2341 [HAOI2006]受欢迎的牛 SCC缩点

    把强连通分量缩点,如果有且仅有一个出度为0的强连通分量,那么答案就是他的size:如果有多个入度为0的,那么没有明星牛. #include<cstdio> #include<iost ...

  2. 【luogu P2341 [HAOI2006]受欢迎的牛】 题解

    题解报告:https://www.luogu.org/problemnew/show/P2341 我们把图中的强连通分量缩点,然后只有出度为0的牛是受欢迎的,这样如果出度为0的牛只有一个,说明受所有牛 ...

  3. Luogu P2341 [HAOI2006]受欢迎的牛

    这道题应该也是经典的SCC题了吧 印象中不知道在在班里上课的时候在紫书,ACM竞赛的那些书上看到多少次(有点奇怪) 首先思路很明显,就是要找出有多少个点,以它们为起点可以遍历整个图 首先考虑一种情况, ...

  4. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

  5. P2341 [HAOI2006]受欢迎的牛(tarjan+缩点)

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

  6. 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...

  7. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...

  8. [Luogu 2341] HAOI2006 受欢迎的牛

    [Luogu 2341] HAOI2006 受欢迎的牛 智能推的水题,一看是省选题就给做了,做一半才发现 Tarjan 算法忘干净了. Tarjan 求出SCC,算出每一个 SCC 包含原图的点数(s ...

  9. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

    P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...

随机推荐

  1. 谈谈数据库的事务ACID

    在数据库中新建一个字段并且设置为索引列,还有删除整张表的数据,类似这些操作都是一系列操作的组合,执行后不能出现中间状态,也就是不会出现新建了字段却不是索引的情况,也不会出现只有一部分数据被删除的情况. ...

  2. matlab中fft快速傅里叶变换

    视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...

  3. 使用appium后安卓手机无法调出键盘解决方法

    问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘. 原因:appium调试时,将手机输入法设置成了Unicode IME 解决方法: 方法一,手机设置里修改输入法: 不同的手 ...

  4. GML与KML的区别

    1.GML是基于XML的地理信息的传输.存储编码,它包括空间的和非空间的地理特征和地理范畴.GML是空 间数据编码.传输.存储.发布的国际标准KML是一个OGC标准 2.GML专注于地理信息的结构与内 ...

  5. 关于ptype_all和pypte_base中的pt_prev的说明[转]

    不知道原帖,我是从这里看到了,解决了迷惑我很久的疑问,抄过来. 看见noble_shi兄弟"关于net_rx_action函数的若干问题"贴中关于pt_prev的问题, 本来想在论 ...

  6. CDH5部署三部曲之三:问题总结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 【学习笔记】陀螺 Treap

    以下来自一堆人从食堂走回机房时的 yy \(\Huge{强烈谴责\ \mathrm{s\color{red}{kyh}}\ 看博客不留评论的行为}\) 听说 longdie 要爆砍 FHQ 无旋 Tr ...

  8. Logstash 国内加速下载 转

    Logstash. 国内直接从官网(https://www.elastic.co)下载比较困难,需要一些技术手段.这里提供一个国内的镜像下载地址列表,方便网友下载. 找不到想要的版本?您可以访问 索引 ...

  9. ▶ 0001 No application 'E:\www\go\blog' found in your GOPATH

    go mod 配置 beego 首先cmd bee new blog go mod init 然后复制到任意目录 bee run 就会报错, 要退出该目录,进入上级目录 bee run blog 才行

  10. 【API管理 APIM】APIM中对后端API服务的DNS域名缓存问题

    问题描述 在使用API Management来进行API管理时,当我们后端的API DNS IP地址发生改变或者是API的域名发生改变后,通过APIM请求访问的还是是旧的域名或者IP地址,这是因API ...