出现环无法完成转换,可以用深搜判环,或者并查集求解。前不久才考过。
#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k;
char a[15], b[15];
string s[100050];
map <string, int> v;//记忆和数组
map <string, string> f;//存储单向边
void dfs(string a){
if(f.find(a) == f.end()) return;
v[a] = 1;//搜索中
string b = f[a];
if(!v[b]) dfs(b);//搜过不再搜
else if(v[b] == 1) m = 1;//环
v[a] = -1;//搜索完
}
int main(){
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%s%s", a, b);
f[a] = b, s[i] = a;
}
for(i=1; i<=n; i++){
if(!v[s[i]]) dfs(s[i]);
}//无环则行,否则不行
printf("%s\n", m?"No":"Yes");
return 0;
}