# [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;
}

浙公网安备 33010602011771号