出现环无法完成转换,可以用深搜判环,或者并查集求解。前不久才考过。

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

作者 crxis

发表回复