1. 程式人生 > 其它 >Codeforces Round #756 (Div. 3) E2. Escape The Maze (hard version)

Codeforces Round #756 (Div. 3) E2. Escape The Maze (hard version)

Codeforces Round #756 (Div. 3) E2題Escape The Maze (hard version)題解

題目

1.題目大意

2.題目分析

  • 在上一題的基礎上:
    1. 輸出為 YES 的情況無人可攔,輸出 -1;
    2. 輸出為 NO 的情況只需要選出:所有無人的葉子結點中,每個結點攔住小 V 的不同的朋友個數。

3.題目程式碼

#include <bits/stdc++.h>
#define MAX 200005

using namespace std;

const int INF = 0x3f3f3f3f;
vector<int> e[MAX];
int dis[MAX], dp[MAX];
int ans = 0;

void dfs(int u, int pre)
{
    if(u != 1)
        dp[u] = dp[pre] + 1;
    for(int v: e[u])
        if(v!=pre)
            dfs(v, u);
}

void dfs2(int u, int pre)
{
    if(dis[u] == 0) return;
    int t = INF;
    for(int v: e[u])
    {
        if(v==pre) continue;
        dfs2(v, u);
        t = min(t, dis[v]);
    }
    dis[u] = t + 1;
}

bool dfs3(int u, int pre)
{
    if(dis[u]<=dp[u])
    {
        ans++;
        return 0;
    }
    if(e[u].size()==1&&u!=1) return 1;
    bool f = 0;
    for(int v: e[u])
        if(v!=pre)
            f |= dfs3(v, u);
    return f;
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int n, k;
        cin >> n >> k;
        for(int i=1;i<=n;i++)
        {
            dp[i] = 0;
            dis[i] = INF;
            e[i].clear();
        }

        for(int i=1;i<=k;i++)
        {
            int t;
            cin >> t;
            dis[t] = 0;
        }
        for(int i=1;i<n;i++)
        {
            int u, v; cin >> u >> v;
            e[u].push_back(v);
            e[v].push_back(u);
        }
        dfs(1, 0);
        dfs2(1, 0);
        if(dfs3(1, 0))
            cout << -1 << endl;
        else
            cout << ans << endl;;
        ans = 0;
    }
}