今天的第二道tarjan:受欢迎的牛
原题来自:USACO 2003 Fall
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 AAA 喜欢 BBB,BBB 喜欢 CCC,那么 AAA 也喜欢 CCC。牛栏里共有 NNN 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。
输入格式
第一行:两个用空格分开的整数:NNN 和 MMM。
接下来 MMM 行:每行两个用空格分开的整数:AAA 和 BBB,表示 AAA 喜欢 BBB。
输出格式
一行单独一个整数,表示明星奶牛的数量。
输入输出样例
输入 #1
3 3 1 2 2 1 2 3
输出 #1
1
说明/提示
只有 3 号奶牛可以做明星。
数据范围

题解
emmmm
这是一到极为经典的,似乎是这一类题的模板的题目:缩点
缩点,也是tarjan的极大的一个作用。
缩点只对强联通分量有用,因为强联通分量中的点可以互相到达,可以被视为一个点。
这题,是肯定是有环的。
那么肯定是很不好去实现遍历的。
怎么办呢?
根据常识,环上的点肯定都在同一个强联通分量中。
强联通分量 -->缩点
经过缩点的图,一定是一个有向无环图
那么只需要一个dfs就好了啊awa
简单题
awa
淦,题解写完了,代码还没写。。。
等等我写完代码awa
#include<bits/stdc++.h> #define ll long long using namespace std; struct edge { int next,to; }e[1000001]; int head[1000001],n,m,w[1000001],tot,ccs,dfsc,low[1000001],dfn[1000001],color[10000001],cnt[1000001],de[1000001],all[1000001];bool vis[1000001]; stack<int> stk; inline ll read() { char c=getchar();ll a=0,b=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1; for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48; return a*b; } void add(int i,int j) { e[++tot].next=head[i]; e[tot].to=j; head[i]=tot; } void tarjan(int x,int fa) { dfn[x]=low[x]=++dfsc; vis[x]=true;stk.push(x); for(int i=head[x];i!=0;i=e[i].next) { int u=e[i].to; // if(u==fa)continue; if(dfn[u]==0) { tarjan(u,x); low[x]=min(low[x],low[u]); } else if(vis[u]==true) { low[x]=min(low[x],dfn[u]); } } if(dfn[x]==low[x]) { int k; ccs++; do { k=stk.top(); stk.pop(); color[k]=ccs; cnt[ccs]++;all[ccs]++; vis[k]=false; } while(x!=k); } } int main() { // freopen(".in","r",stdin); // freopen(".out","w",stdout); n=read();m=read(); for(int i=1;i<=m;i++) { int x=read();int y=read(); add(x,y); } for(int i=1;i<=n;i++) { if(dfn[i]==0) { tarjan(i,-1); } } // for(int i=1;i<=n;i++) // { // cout<<color[i]<<endl; // } for(int i=1;i<=n;i++) { int x=i; for(int j=head[x];j!=0;j=e[j].next) { int u=e[j].to; if(color[u]!=color[x]) { de[color[i]]++; } } } int ans=0,sum=0;bool tt=0; for(int i=1;i<=ccs;i++) { if(de[i]==0) { ans+=cnt[color[i]]; sum++; if(tt){puts("0");return 0;} tt=i; } } cout<<all[tt]<<endl; return 0; }
n年前的草稿总算是发布了awa
网址:今天的第二道tarjan:受欢迎的牛 https://mxgxt.com/news/view/1676882
相关内容
奶牛猫为什么这么受欢迎[USACO03FALL / HAOI2006] 受欢迎的牛 G
揭秘最受欢迎的6
队史第二位全明星首发!莫兰特今日到球馆时受到夹道欢迎
奶牛猫为什么那么受欢迎
二月份星座受欢迎程度解析
最受欢迎的六大歌手,周杰伦只能排第二,第一名果然是他!
《小戏骨》最受欢迎的小公主,陶奕希第五,陶冰蓝第二,第一是她
刘德华亲自缝制牛公仔 造型可爱大受欢迎
哪个星座最受欢迎
随便看看
- 太阳纸业董秘回复:公司将积极践行国家的“碳达峰、碳中和”工作。公司正在组织相关部门学习相关政策和碳汇交易的相关知识和流程,全力投入到碳交易工作的相关准备及运作工作中。谢谢对我司的关注和支持。
- 企业家的内功心法
- 【平阳贝壳口腔门诊部】你想要如明星般亮白闪耀的牙齿吗?
- 太阳纸业董秘回复:公司在山东、广西和老挝三个基地均有自制木浆产能的配置,主要木浆品种包括造纸用化学浆、化学机械浆、半化学浆、废纸浆和溶解浆等。公司拥有近110万吨的新型纤维原料(包括半化学浆、本色化学浆、废纸浆及木屑浆)可以替代废纸,在包装
- 太阳纸业董秘回复:氢氧化钠(也称苛性钠、烧碱)主要用于制浆的生产,抄纸用量很少。氢氧化钠是制浆生产重要的化学助剂,在蒸煮和漂白环节均有使用,但主要用于蒸煮环节。在制浆过程所需化学品的成本中,氢氧化钠所占成本比重较高,当然不同的制浆方法氢氧化
- 太阳纸业董秘回复:公司在业内首创从水解液中提炼木糖技术,逐步掌握了产业化生产的关键工艺。公司研发、生产的木糖等产品是生产溶解浆的副产品,实际产量有一定限制,近年来溶解浆市场的景气度波动较大,溶解浆生产线存在诸如转产造纸木浆、停机检修等情形,
- 福州罗源磹石村:“明星村”里故事多
- 高库存与高利润下的纸浆:“危若累卵”
- 中国优材(01885):调查事项仍在进行 进一步延迟刊登2020年全年业绩
- 太阳纸业董秘回复:公司结合行业的发展趋势,按照太阳纸业既定的经营发展策略,围绕公司主业实施新的投资项目,目前公司已经构建起了山东、广西和老挝三大基地:山东基地服务北方市场,广西基地服务南方市场,老挝基地将作为太阳纸业的原料基地,“三大基地”

