POJ2186:Popular Cows(tarjan+缩点)
题目解析:
这题题意没什么好说的,解法也挺简单的,只要会tarjan算法+只有一个出度为0的强连通分量题目有解这题就迎刃而解了。
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #define N 100002 using namespace std; int n,m,tt,time,cnt,e,a[N],b[N],sum[N]; struct node { int x,y; int next; } eg[1000001]; int head[N],low[N],dfn[N],f[N],instack[N],belong[N],s[N]; void init() { memset(head,-1,sizeof(head)); memset(instack,0,sizeof(instack)); memset(belong,0,sizeof(belong)); memset(sum,0,sizeof(sum)); memset(f,0,sizeof(f)); tt=0; cnt=0; } void add(int xx,int yy) { eg[tt].x=xx; eg[tt].y=yy; eg[tt].next=head[xx]; head[xx]=tt++; } void tarjan(int i) { int w; dfn[i]=low[i]=++time; instack[i]=1; s[++e]=i; for(int j=head[i]; j!=-1; j=eg[j].next) { w=eg[j].y; if(!dfn[w]) { tarjan(w); low[i]=min(low[i],low[w]); } else if(instack[w]==1) { low[i]=min(low[i],dfn[w]); } } if(dfn[i]==low[i]) { cnt++; do { w=s[e--]; instack[w]=0; belong[w]=cnt; } while(w!=i); } } void solve() { time=e=0; memset(dfn,0,sizeof(dfn)); for(int i=1; i<=n; i++) { if(!dfn[i]) { tarjan(i); } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=1; i<=m; i++) { scanf("%d%d",&a[i],&b[i]); add(a[i],b[i]); } solve(); for(int i=1; i<=m; i++) { if(belong[a[i]]!=belong[b[i]]) { f[belong[a[i]]]=1; } } for(int i=1; i<=n; i++) { sum[belong[i]]++; } int V=0,count; for(int i=1; i<=cnt; i++) { if(!f[i]) { V++; count=sum[i]; } } if(V==1) printf("%d\n",count); else printf("0\n"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构