听灌多
  • 板块灌水区
  • 楼主M_Jun
  • 当前回复6
  • 已保存回复11
  • 发布时间2024/10/26 17:22
  • 上次更新2024/10/26 18:59:15
查看原帖
听灌多
1098953
M_Jun楼主2024/10/26 17:22

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 ;
} 
2024/10/26 17:22
加载中...