【HAOI2006】【luogu2341】受欢迎的牛

            
//即缩点拓扑序以后最后一个SCC的大小

#include
#include
#include
#include
#define maxn 10010
using namespace std;
vector<int>G[maxn],rG[maxn],cmp[maxn],vs;
int vis[maxn], cnt, flag;
void dfs(int u){
vis[u] = 1;
for(int i = 0; i < G[u].size(); i++)
if(!vis[G[u][i]])dfs(G[u][i]);
vs.push_back(u);
}
void rdfs(int u){
vis[u] = 1;
if(!flag)cmp[cnt].push_back(u);
for(int i = 0; i < rG[u].size(); i++)
if(!vis[rG[u][i]])rdfs(rG[u][i]);
}
int main(){
int n, m;
cin>>n>>m;
for(int i = 1; i <= m; i++){
int x, y; cin>>x>>y;
G[x].push_back(y);
rG[y].push_back(x);
}
for(int i = 1; i <= n; i++)
if(!vis[i])dfs(i);
memset(vis, 0, sizeof vis);
for(int i = n-1; i >= 0; i--)
if(!vis[vs[i]]){ cnt++; rdfs(vs[i]); }
flag = 1;
memset(vis, 0, sizeof vis);
rdfs(cmp[cnt][0]);
for(int i = 1; i <= n; i++)
if(!vis[i])cmp[cnt].resize(0);
cout<<cmp[cnt].size()<<"\n";
return 0;
}

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像