xbs组合代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <vector>
using namespace std;
const int MAX_M = 5e4+10;
int N, M;
int A[MAX_M], B[MAX_M];
const int MAX_V = 10100;
int V; //顶点数
vector<int> G[MAX_V];
vector<int> rG[MAX_V];
vector<int> vs;
bool used[MAX_V];
int cmp[MAX_V];
void add_edge(int from,int to){
G[from].push_back(to);
rG[to].push_back(from);
// cout<<" from = "<<from<<" to = "<<to<<endl;
}
void dfs(int v){
used[v] = true;
for(int i=0;i<G[v].size();i++){
if(!used[G[v][i]]) dfs(G[v][i]);
}
vs.push_back(v);
// cout<<" v =" <<v<<endl;
}
void rdfs(int v,int k){
used[v] = true;
cmp[v] = k;
// cout<<"rG[v].size() = "<<rG[v].size()<<endl;
for(int i=0;i<rG[v].size();i++){
if(!used[rG[v][i]]) rdfs(rG[v][i],k);
}
// cout<<"k="<<k<<endl;
}
int scc(){
memset(used,0,sizeof(used));
vs.clear();
for(int v=0;v<V;v++){
if(!used[v]) dfs(v);
}
memset(used,0,sizeof(used));
int k = 0;
// cout<<" vs[0] = "<<vs[0]<<endl;
for(int i=vs.size()-1;i>=0;i--){
if(!used[vs[i]])rdfs(vs[i],k++);
// cout<<"i="<<i<<endl;
}
// cout<<"-------------"<<endl;
return k;
}
void solve(){
V = N;
for(int i=0;i<M;i++){
add_edge(A[i]-1,B[i]-1);
}
int n = scc();
// cout<<"n = "<<n<<endl;
int u = 0, num = 0;
for(int v=0;v<V;v++){
// cout<<" cmp [v] = "<<cmp[v]<<endl;
if(cmp[v]==n-1){
u=v;
num++;
}
}
memset(used,0,sizeof(used));
rdfs(u,0);
// cout<<" u "<<u<<endl;
// for(int i=0;i<rG[u].size();i++)
// cout<<"rg[u][i]="<<rG[u][i]<<endl;
// for(int i=0;i<vs.size();i++)
// cout<<"vs[i] = "<<vs[i]<<endl;
for(int v =0;v<V;v++){
// cout<<" used[v] = "<<used[v]<<endl;
if(!used[v]){
num = 0;
break;
}
}
printf("%d\n",num);
}
int main(){
cin>>N>>M;
for(int i=0;i<M;i++)
cin>>A[i]>>B[i];
solve();
return 0;
}