# [ABC285D]Change Usernames [DAG] [离散化] [拓扑排序]

[ABC285D]Change Usernames [DAG] [离散化] [拓扑排序]

D - Change Usernames (atcoder.jp)

\(N\) 个用户,每个用户有一个用户名 \(S_i\) 现在每个用户都想改成另一个用户名 \(T_i\),如果一个用户想要改的名字没有人正在用,那么这个用户可以改名。现在用户改名的顺序由你决定,请问是否所有用户都可以成功改名。

思路

对于每个\(u_i\) 改名为 \(v_i\)的操作可以视为在\(u_i\)\(v_i\) 之间连一条单向边

如果变成了环,那么不可以成立

至于环的判断我们可以用之前学过的拓扑判环来判断

如果走过的点数等于总点数那么就是一个拓扑序列

否则就是有环的

key code

const int N=1e6+10;
int n;
map<string,int>m;
vector<int>vec[N];
queue<int>q;
int vis[N];
void solve(){
	//try it again.
	int js=0;
	cin>>n;
	fup(i,1,n){
		string u,v;
		cin>>u>>v;
		if(m[u]==0)m[u]=++js;
		if(m[v]==0)m[v]=++js;
		vec[m[u]].pb(m[v]);
		vis[m[v]]++;
	}
	fup(i,1,js)if(!vis[i])q.push(i);
	int tot=0;
	while(!q.empty()){
		int head=q.front();q.pop();
		tot++;
		for(auto it:vec[head]){
			if(!vis[it])continue;
			vis[it]--;
			if(!vis[it])q.push(it);
		}
	}
	if(tot==js)cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}
posted @ 2023-03-12 00:32  liangqianxing  阅读(67)  评论(0)    收藏  举报