题目:点击打开链接
思路:强连通分量 中节点数大于1 的个数。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
int n,m;
vector<int> a[10005];
int color[10005]= {0};
int s=0,s1=0;
int stack[10005]= {0};
map<int,int> instack;
int top=0;
int dfn[10005]= {0},low[10005]= {0};
int num=0;
int dfs(int x) {
stack[++top]=x;
instack[x]=top;
dfn[x]=++num;
low[x]=num;
for(int i=0; i<a[x].size(); i++) {
if(color[a[x][i]]==0&&!instack.count(a[x][i])) {
low[x]=min(low[x],dfs(a[x][i]));
} else if(color[a[x][i]]==0) {
low[x]=min(low[x],dfn[a[x][i]]); //
}
}
if(dfn[x]==low[x]) {
s++;
for(int i=instack[x]; i<=top; i++) {
color[stack[i]]=s;
}
if(instack[x]<top) {
s1++;
}
top=instack[x]-1;
}
return low[x];
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++) {
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);
}
for(int i=1; i<=n; i++) {
if(color[i]==0) {
dfs(i);
}
}
printf("%d\n",s1);
return 0;
}