P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G —— Tarjan缩点
[USACO03FALL / HAOI2006] 受欢迎的牛 G
题目背景
本题测试数据已修复。
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 喜欢 , 喜欢 ,那么 也喜欢 。牛栏里共有 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。
输入格式
第一行:两个用空格分开的整数: 和 。
接下来 行:每行两个用空格分开的整数: 和 ,表示 喜欢 。
输出格式
一行单独一个整数,表示明星奶牛的数量。
样例 #1
样例输入 #1
3 3 1 2 2 1 2 3
样例输出 #1
1
提示
只有 号奶牛可以做明星。
【数据范围】
对于 的数据,,。
对于 的数据,,。
对于 的数据,,。
对于 的数据,,。
分析
先跑Tarjan求出所有SCC。
当新图上有且仅有一个出度为零的点 时有 。
#include<bits/stdc++.h> using namespace std; const int N=2e4+100,M=1e5+100; int n,m; int dfn[N],low[N],tot,dd; int sta[N],top,id,scc[N],siz[N]; int deg1[N],deg2[N]; bool inc[N]; vector<int>g[N],h[N]; void go(int u) { sta[++top]=u; inc[u]=1; low[u]=dfn[u]=++tot; for(int i=0;i<deg1[u];++i) { int v=g[u][i]; if(!dfn[v]) { go(v); low[u]=min(low[u],low[v]); } else if(inc[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { ++id; while(sta[top]!=u) { scc[sta[top]]=id; ++siz[id]; inc[sta[top]]=0; --top; } scc[u]=id; ++siz[id]; inc[u]=0; --top; } } int main() { scanf("%d%d",&n,&m); for(int i=1,x,y;i<=m;++i) { scanf("%d%d",&x,&y); g[x].push_back(y); ++deg1[x]; } for(int i=1;i<=n;++i) if(!dfn[i]) go(i); for(int i=1;i<=n;++i) { for(int j=0;j<deg1[i];++j) { int v=g[i][j]; if(scc[v]!=scc[i]) h[scc[i]].push_back(scc[v]); } } for(int i=1;i<=id;++i) deg2[i]=unique(h[i].begin(),h[i].end())-h[i].begin(); int tot=0,num=0; for(int i=1;i<=id;++i) { if(deg2[i]==0) { ++tot; num=siz[i]; } } if(tot!=1){cout<<0;} else cout<<num; return 0; }
本文来自博客园,作者:Glowingfire,转载请注明原文链接:https://www.cnblogs.com/Glowingfire/p/18576247
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具