社区讨论

大雾(

P1407[国家集训队] 稳定婚姻参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mjvbaphe
此快照首次捕获于
2026/01/01 18:38
2 个月前
此快照最后确认于
2026/01/01 18:47
2 个月前
查看原帖
注意看20pts代码:
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
map<string,int> e;
vector<int> f[400010];stack<int> st;bool in[400010];
int n,i,m,dfn[8010],low[8010],belong[8010],cnt,cz;
string x,y;
void tarjan(int x){
	dfn[x]=low[x]=++cnt;in[x]=1;st.push(x);
	for(int i:f[x])
		if(!dfn[i]) tarjan(i),low[x]=min(low[x],low[i]);
		else if(in[i]) low[x]=min(low[x],dfn[i]);
	if(dfn[x]==low[x]){
		cz++;int y;
		do{
			y=st.top();st.pop();in[y]=0;
			belong[y]=cz;
		}while(y!=x);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>x>>y;
		e[x]=i;e[y]=i+n;
		f[i].push_back(i+n);
	}	
	cin>>m;
	for(i=1;i<=m;i++){
		cin>>x>>y;
		f[e[y]].push_back(e[x]);
	}
	for(i=1;i<=n*2;i++) if(!dfn[i]) tarjan(i);
	for(i=1;i<=n;i++)
		if(belong[e[x]]==belong[e[y]]) cout<<"Unsafe\n";
		else cout<<"Safe\n";
	return 0;
}
100pts:
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
map<string,int> e;
vector<int> f[400010];stack<int> st;bool in[400010];
int n,i,m,dfn[8010],low[8010],belong[8010],cnt,cz;
string x,y;
void tarjan(int x){
	dfn[x]=low[x]=++cnt;in[x]=1;st.push(x);
	for(int i:f[x])
		if(!dfn[i]) tarjan(i),low[x]=min(low[x],low[i]);
		else if(in[i]) low[x]=min(low[x],dfn[i]);
	if(dfn[x]==low[x]){
		cz++;int y;
		do{
			y=st.top();st.pop();in[y]=0;
			belong[y]=cz;
		}while(y!=x);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>x>>y;
		e[x]=i;e[y]=i+n;
		f[i].push_back(i+n);
	}	
	cin>>m;
	for(i=1;i<=m;i++){
		cin>>x>>y;
		f[e[y]].push_back(e[x]);
	}
	for(i=1;i<=n*2;i++) if(!dfn[i]) tarjan(i);
	for(i=1;i<=n;i++)
		if(belong[i]==belong[i+n]) cout<<"Unsafe\n";
		else cout<<"Safe\n";
	return 0;
}
为什么修改了这个就对了,玄关!

回复

1 条回复,欢迎继续交流。

正在加载回复...