tarjan缩点模板
#include<cstdio> #include<stack> #include<map> using namespace std; const int maxn=50010; stack<int>q; int head[maxn],nxt[maxn],to[maxn],tt; int dfn[maxn],low[maxn]; int n,m,index,bcnt; int belong[maxn]; bool vis[maxn]; int in[maxn],out[maxn]; //map<pair<int,int>,int>mp; int min(int x,int y) { return x>y?y:x; } int max(int x,int y) { return x>y?x:y; } int read() { int x=0,f=1;char ch=getchar(); while (ch<'0' || ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0' && ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } void add(int u,int v) { to[++tt]=v; nxt[tt]=head[u]; head[u]=tt; } void tarjan(int u) { low[u]=dfn[u]=++index; q.push(u);vis[u]=1; for(int i=head[u];i;i=nxt[i]) { int v=to[i]; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); //printf("%d\n",low[u]); } else if(vis[v]) { low[u]=min(dfn[v],low[u]); //printf("%d\n",low[u]); } } if(low[u]==dfn[u]) { int k;bcnt++; while(k!=u) { k=q.top();q.pop(); vis[k]=0; belong[k]=bcnt; } } } int main() { n=read();//m=read(); for(int i=1;i<=n;i++) { while(true) { int tmp=read(); //if(mp.count(make_pair(1,tmp))>0) continue; if(tmp!=0&&tmp!=i) { add(i,tmp); //mp[make_pair(i,tmp)]=1; } else if(tmp==0) break; } } for(int i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } for(int u=1;u<=n;u++) for(int i=head[u];i;i=nxt[i]) { int v=to[i]; if(belong[u]!=belong[v]) { in[belong[v]]++;out[belong[u]]++; } } int t1=0,t2=0; for(int i=1;i<=bcnt;i++) { if(in[i]==0) t1++; if(out[i]==0) t2++; } printf("%d\n",t1); if(bcnt==1) { printf("0"); } else printf("%d",max(t1,t2)); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析