1. 程式人生 > >HDU-5971 Wrestling Match

HDU-5971 Wrestling Match

題意: 給定一些匹配, 現在有一個條件, 匹配的雙方有一個時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;
}