HDU-5971 Wrestling Match
阿新 • • 發佈:2018-12-13
題意: 給定一些匹配, 現在有一個條件, 匹配的雙方有一個時good player, 一個是bad player。 在給定一部分good player和bad player的編號, 現在要求判斷給定的所有人是否可以判斷他們的身份, 即可以知道他們是good 或者 bad。 分析: 所有的運動員要確定他們的身份,那麼首先他們每個人要麼比賽過, 要麼身份給定了。 並且他們之間的相互關係還不能有矛盾。 根據這一點, 暴力列舉每一個運動員, 然後根據給定的匹配和身份進行dfs, 若dfs判斷到了矛盾, 那麼就不能判斷身份。
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> using namespace std; const int MAXN = 1000 + 10; vector<int> p[MAXN]; int visit[MAXN], mark[MAXN]; int n, m, x, y; bool dfs(int u) { for (int i = 0; i < p[u].size(); i++) { int v = p[u][i]; if (!mark[v]) { mark[v] = !mark[u]; if (!dfs(v)) return 0; } else if (mark[u] == mark[v]) { return 0; } } return 1; } int main() { while (cin >> n >> m >> x >> y) { for (int i = 0; i < MAXN; i++) p[i].clear(); memset(visit, 0, sizeof(visit)); memset(mark, 0, sizeof(mark)); for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; p[a].push_back(b); visit[a] = visit[b] = 1; } for (int i = 0; i < x; i++) { int a; cin >> a; visit[a] = 1; mark[a] = 1; } for (int i = 0; i < y; i++) { int b; cin >> b; visit[b] = 1; mark[b] = 0; } int cnt = 0; for (int i = 1; i <= n; i++) { if (visit[i]) cnt++; } if (cnt < n || n == 1) { printf("NO\n"); continue; } bool flag = true; for (int i = 1; i <= n; i++) { if (!dfs(i)) { flag = false; break; } } if (flag) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }