萌新求助联通分量
查看原帖
萌新求助联通分量
125454
CLCA_楼主2020/9/21 10:11

为什么本题建无向图求双联通分量会挂。

求助是算法错误还是写挂了。

#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;
} 
2020/9/21 10:11
加载中...