- [USACO03FALL / HAOI2006] 受欢迎的牛 G
对拍
- 2025-7-4 13:46:58 @
对拍
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=50001;
vector<int>edge[MAXN];
int instk[MAXN],dfn[MAXN],ss[MAXN],low[MAXN],belong[MAXN],in[MAXN],tot,stknum,ans,n,m;
vector<int>g[MAXN];
stack<int>stk;
void tarjan(int x){
dfn[x]=low[x]=++tot,instk[x]=1;
stk.push(x);
for(int i:edge[x]){
if(!dfn[i]){
tarjan(i);
low[x]=min(low[x],low[i]);
}else if(instk[i]){
low[x]=min(low[x],dfn[i]);
}
}
if(dfn[x]==low[x]){
int y;
stknum++;
do{
y=stk.top();
stk.pop();
ss[stknum]++;
instk[y]=0;
belong[y]=stknum;
}while(y!=x);
}
}
signed main(){
cin>>n>>m;
if(n>m+1){
cout<<0;
return 0;
}
for(int i=1;i<=m;i++){
int u,v;
cin>>v>>u;
edge[u].emplace_back(v);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
for(int i=1;i<=n;i++){
for(int j:edge[i]){
if(belong[i]!=belong[j])in[belong[j]]++;
}
}
int ans=0;
for(int i=1;i<=stknum;i++){
if(in[i]==0&&ans){
cout<<0;
return 0;
}
ans+=in[i]==0?ss[i]:0;
}
cout<<ans;
}
0 comments
No comments so far...
Information
- ID
- 420
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 56
- Accepted
- 13
- Uploaded By