为什么本题建无向图求双联通分量会挂。
求助是算法错误还是写挂了。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 100005
using namespace std;
int h[N],tot=1;
struct edge{
int to,nxt;
}e[N<<1];
void add(int x,int y){
//cout<<x<<" "<<y<<endl;
e[++tot].nxt=h[x];h[x]=tot;e[tot].to=y;
//cout<<tot<<endl;
}
int n,m;
map<string,int>mp;
int T=0;string a,b;
int dfn[N],low[N],idx,v[N],del[N];
void dfs(int x,int fa){
//cout<<"uu "<<x<<" "<<fa<<endl;
dfn[x]=low[x]=++idx;
for(int i=h[x];i;i=e[i].nxt)if(i!=(fa^1)){
//cout<<"rrb "<<i<<endl;
if(!dfn[e[i].to])dfs(e[i].to,i),low[x]=min(low[x],low[e[i].to]);
else low[x]=min(low[x],dfn[e[i].to]);
}
if(fa){
//cout<<"tt "<<fa<<endl;
if(low[x]>dfn[e[fa^1].to])del[fa]=del[fa^1]=1;//,cout<<"ss"<<" "<<x<<" "<<e[fa^1].to<<endl;
}
}
void calc(int x,int op){
v[x]=op;
for(int i=h[x];i;i=e[i].nxt)if(!del[i]&&!v[e[i].to])calc(e[i].to,op);
}
int main(){
scanf("%d",&n);
rep(i,1,n){
cin>>a>>b;
if(!mp[a])mp[a]=++T;
if(!mp[b])mp[b]=++T;
add(mp[a],mp[b]);add(mp[b],mp[a]);
}
scanf("%d",&m);
rep(i,1,m){
cin>>a>>b;
add(mp[a],mp[b]);add(mp[b],mp[a]);
}
rep(i,1,T)if(!dfn[i])dfs(i,0);
int cnt=0;
//rep(i,2,tot)printf("%d ",del[i]);putchar('\n');
rep(i,1,T){
if(!v[i])calc(i,++cnt);
}
//cout<<T<<endl;
//rep(i,1,T)printf("%d ",v[i]);putchar('\n');
rep(i,1,n){
if(v[i*2-1]==v[i*2])puts("Unsafe");
else puts("Safe");
}
return 0;
}