P2863 死循环T飞,求调 ,代码如下
#include <iostream>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std ;
//int tiashiyongde ;
const int N = 1e4 + 5 ;
const int M = 5e4 + 5 ;
int cnt ;
struct Node_Edge {
int from ;
int next ;
int to ;
} edge[M] ;
int head[M] ;
stack<int> Stark ;
int index ;
int dfn[N] ;
int low[N] ;
int n , m ;
int a , b ;
int ans ;
void Tarjan(int u) {
// cout << ++ tiashiyongde << '\n' ;
dfn[u] = low[u] = index ++ ;
Stark.push(u) ;
register int v ;
for(register int i = head[u] ; i != -1 ; i = edge[i].next) {
v = edge[i].to ;
if(dfn[u] != -1) {
Tarjan(v) ;
low[u] = min(low[u] , low[v]) ;
} else if(dfn[u] == -1)
low[u] = min(low[u] , dfn[v]) ;
}
if(dfn[u] == low[u]) {
ans ++ ;
while(u != v)
Stark.pop() ;
}
return ;
}
inline void add_edge(int u , int v) {
edge[cnt].to = v ;
edge[cnt].next = head[u] ;
head[u] = cnt++ ;
return ;
}
signed main ( ) {
// cout << ++ tiashiyongde << '\n' ;
for(register int i = 1 ; i <= N ; i ++) dfn[i] = -1 ;
for(register int i = 1 ; i <= M ; i ++) head[i] = -1 ;
cin >> n >> m ;
// cout << ++ tiashiyongde << '\n' ;
for(register int i = 1 ; i <= m ; i ++) {
cin >> a >> b ;
add_edge(a , b) ;
// cout << ++ tiashiyongde << '\n' ;
}
// cout << ++ tiashiyongde << '\n' ;
Tarjan(1) ;
// cout << ++ tiashiyongde << '\n' ;
cout << ans << '\n' ;
return 0 ;
}