站外题求助(Tarjan水题)
  • 板块学术版
  • 楼主PCCP
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/6/9 19:43
  • 上次更新2023/10/23 13:34:17
查看原帖
站外题求助(Tarjan水题)
310773
PCCP楼主2023/6/9 19:43

今天写个Tarjan判断有向图是否强连通的题,我直接复制洛谷里AC代码改的,结果一直WA,家人们谁懂啊

原题是HDU-1269

不知道是我学的Tarjan有问题还是怎么样,反正多测清空了,空间也够,真的奇怪。

蒟蒻可以提供一个关注。

代码如下:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<set>
using namespace std;
const int N=1e4+10;
const int M=1e6+10;
int n,m;
int he[N<<1],ne[M<<1],to[M<<1],tot;
void addedge(int x,int y){
	to[++tot]=y;
	ne[tot]=he[x];
	he[x]=tot;
}
int dfo[N],low[N],cnt=0,scccnt=0;
stack <int> q;
bool st[N];
void tarjan(int x){
	dfo[x]=low[x]=++cnt;
	q.push(x);
	st[x]=1;
	for(int i=he[x];i;i=ne[i]){
		int v=to[i];
		if(!dfo[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
		else if(st[v]==1){
			low[x]=min(low[x],dfo[v]);
		}
	}
	if(low[x]==dfo[x]){
		++scccnt;
		for(int i=1;i;i++){
			st[q.top()]=0;
			if(q.top()==x){
				q.pop();
				break;
			}
			q.pop();
		}
	}
}
int main(){
	while(scanf("%d%d",&n,&m)&&n!=0&&m!=0){
		memset(st,0,sizeof st);
		memset(dfo,0,sizeof dfo);
		memset(low,0,sizeof low);
		memset(he,0,sizeof he);
		memset(to,0,sizeof to);
		memset(ne,0,sizeof ne);
		scccnt=0,tot=0,cnt=0;
		while(q.size()){
			q.pop();
		}
		int x,y;
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			addedge(x,y);
		}
		for(int i=1;i<=n;i++){
			if(!dfo[i]){
				tarjan(i);
			}
		}
		if(scccnt==1){
			printf("Yes\n");
		}
		else{
			printf("No\n");
		}
	}
} 
2023/6/9 19:43
加载中...