P2863 [USACO06JAN] The Cow Prom S
题目描述
有一个nnn个点,mmm条边的有向图,请求出这个图点数大于111的强连通分量个数。
输入格式
第一行为两个整数nnn和mmm。
第二行至m+1m+1m+1行,每一行有两个整数aaa和bbb,表示有一条从aaa到bbb的有向边。
输出格式
仅一行,表示点数大于111的强连通分量个数。
输入输出样例 #1
输入 #1
5 4 2 4 3 5 1 2 4 1输出 #1
1说明/提示
数据规模与约定
对于全部的测试点,保证2≤n≤1042\le n \le 10^42≤n≤104,2≤m≤5×1042\le m\le 5\times 10^42≤m≤5×104,1≤a,b≤n1 \leq a, b \leq n1≤a,b≤n。
C++实现
#include<bits/stdc++.h>#definemaxn10001usingnamespacestd;vector<int>G[maxn];stack<int>s;intn,m;intdfn[maxn],used[maxn],vis[maxn],low[maxn],color[maxn],num[maxn],colornum=0,cnt=0,ans=0;voidpaint(intx){s.pop();color[x]=colornum;num[colornum]++;vis[x]=false;}voidtarjan(intx){dfn[x]=low[x]=++cnt;s.push(x);vis[x]=used[x]=true;for(inti=0;i<G[x].size();i++){intq=G[x][i];if(!dfn[q]){tarjan(q);low[x]=min(low[x],low[q]);}elseif(vis[q])low[x]=min(low[x],dfn[q]);}if(low[x]==dfn[x]){colornum++;while(s.top()!=x){intt=s.top();paint(t);}paint(x);}}intmain(){cin>>n>>m;for(inti=1;i<=m;i++){intu,v;cin>>u>>v;G[u].push_back(v);}for(inti=1;i<=n;i++){if(!used[i])tarjan(i);}for(inti=1;i<=colornum;i++){if(num[i]>1)ans++;}cout<<ans;return0;}后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容