Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- //#include <iostream>
- #include <vector>
- #include <set>
- #include <queue>
- #include <string>
- using namespace std;
- vector<bool> isTermin1;
- vector<bool> isTermin2;
- vector<bool> used;
- vector<vector<int>> aut1; // [i][c] перейти из состояния i по символу (с + 'a')
- vector<vector<int>> aut2;
- bool check(int a = 1, int b = 1) {
- if (isTermin1[a] != isTermin2[b]) {
- return false;
- }
- used[a] = true;
- for (int i = 0; i < 26; ++i) {
- if ((aut1[a][i] != 0 && aut2[b][i] == 0) || (aut1[a][i] == 0 && aut2[b][i] != 0) ||
- (!used[aut1[a][i]] && !check(aut1[a][i], aut2[b][i]))) {
- return false;
- }
- }
- return true;
- }
- int main() {
- int n1, m1, k1, n2, m2, k2;
- ifstream cin("isomorphism.in");
- ofstream cout("isomorphism.out");
- cin >> n1 >> m1 >> k1;
- isTermin1.resize(n1 + 1);
- used.resize(n1 + 1);
- aut1.assign(n1 + 1, vector<int>(26, 0));
- for (int i = 0; i < k1; ++i) {
- int q;
- cin >> q;
- isTermin1[q] = true;
- }
- for (int i = 0; i < m1; ++i) {
- int a, b;
- char c;
- cin >> a >> b >> c;
- aut1[a][c - 'a'] = b;
- }
- cin >> n2 >> m2 >> k2;
- if (n1 != n2) {
- cout << "NO";
- return 0;
- }
- isTermin2.resize(n2 + 1);
- aut2.assign(n2 + 1, vector<int>(26, 0));
- for (int i = 0; i < k2; ++i) {
- int q;
- cin >> q;
- isTermin2[q] = true;
- }
- for (int i = 0; i < m2; ++i) {
- int a, b;
- char c;
- cin >> a >> b >> c;
- aut2[a][c - 'a'] = b;
- }
- if (check()) {
- cout << "YES";
- } else {
- cout << "NO";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement