5分求调(玄关)
查看原帖
5分求调(玄关)
1269111
Eden_star楼主2024/12/5 20:09
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,t,cnt,sign;
int dfn[N],low[N],scc[N],male[N],female[N];
int stk0[N],cn;
vector<int> pic[N],scc_[N];
queue<int> q;
map<string,int> name;
void _set(){
	cn=0;
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(scc,0,sizeof(scc));
}
void tarjan(int u);
int main(){
	_set();
	string u,v;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>u>>v;
		male[i]=name[u]=++t;
		female[i]=name[v]=++t;
		pic[name[u]].push_back(name[v]);
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		pic[name[v]].push_back(name[u]);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int i=1;i<=n;i++){
		if(scc[male[i]]==scc[female[i]]){
			cout<<scc[male[i]]<<" "<<scc[female[i]];
			cout<<"Unsafe\n";
		}
		else cout<<"Safe\n";
	}
	return 0;
}
void tarjan(int u){
	int v;
	dfn[u]=low[u]=++sign;
	stk0[++cn]=u;
	for(int i=0;i<pic[u].size();i++){
		if(!dfn[pic[u][i]]){
			tarjan(pic[u][i]);
			low[u]=min(low[u],low[pic[u][i]]);
		}
		else if(!scc[pic[u][i]]){
			low[u]=min(dfn[pic[u][i]],low[u]);
		}
	}
	if(low[u]==dfn[u]){
		cnt++;
		do{
			v=stk0[cn--];
			scc_[cnt].push_back(v);
			scc[v]=cnt;
		}while(u!=v);
	}
}
2024/12/5 20:09
加载中...