今天写个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");
}
}
}