【题目链接】
【思路要点】
- 补档博客,无题解。
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXN 3005 vector <int> a[MAXN]; int n, m; bool visited[MAXN]; char ans[MAXN]; void work(int x) { visited[x] = true; for (unsigned i = 0; i < a[x].size(); i++) if (!visited[a[x][i]]) work(a[x][i]); } bool check(int x) { memset(visited, false, sizeof(visited)); work(x); for (int i = 1; i <= n; i++) if (visited[i * 2] && visited[i * 2 + 1]) return false; return true; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int x, y; char optx, opty; scanf("%d %c %d %c", &x, &optx, &y, &opty); x = x * 2 + (optx == 'Y'); y = y * 2 + (opty == 'Y'); a[x ^ 1].push_back(y); a[y ^ 1].push_back(x); } for (int i = 1; i <= n; i++) { bool N = check(i * 2), Y = check(i * 2 + 1); if (!N && !Y) { printf("IMPOSSIBLE\n"); return 0; } if (N && Y) ans[i] = '?'; else if (N) ans[i] = 'N'; else ans[i] = 'Y'; } for (int i = 1; i <= n; i++) printf("%c", ans[i]); printf("\n"); return 0; }