zoukankan      html  css  js  c++  java
  • luoguP5836 [USACO19DEC]Milk Visits S

    题目是一颗生成树,所以路径唯一

    树上只有两种颜色,如果客人在经过的路径上有自己喜欢的颜色,则输出 1,否则输出 0

    可以用并查集来把相同的颜色合并起来。

    (a,b) 颜色相同,(col[a]!=c) 路上全是客人不喜欢的颜色,输出 0

    (a,b) 颜色相同,(col[a]==c) ,路上全是客人喜欢的颜色,输出 1

    (a,b) 颜色不同,那么说明这条路肯定经过两种颜色,那么客人喜欢的颜色一定在其中,输出 1

    并查集
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int fa[N],str[N*3],n,m;
    char col[N];
    int find(int x) {
        if(fa[x] != x) return fa[x] = find(fa[x]);
        return x;
    }
    void merge(int a,int b) {
        fa[find(a)] = find(b);
    }
    int main() {
        cin >> n >> m;
        for(int i = 1;i <= n; ++i) {
            fa[i] = i;
            cin >> col[i];
        }
        for(int i = 0;i < n - 1; ++i) {
            int a,b;cin >> a >> b;
            if(col[a] == col[b]) merge(a,b);
        }
        for(int i = 0;i < m; ++i) {
            int a,b;
            char c;
            cin >> a >> b >> c;
            if(find(a) == find(b) && col[a] != c) str[i] = 0;
            else str[i] = 1;
        }
        for(int i = 0;i < m; ++i) cout << str[i];
        return 0;
    }
    
  • 相关阅读:
    Gym
    Gym 100712H
    CodeForces
    CodeForces
    P1103 书本整理(DP)
    P1435 回文子串(最长公共子序列)
    P1095 守望者的逃离(线性DP)
    P1077 摆花(背包)
    P1832 A+B Problem(再升级)
    P1757 通天之分组背包(分组背包)
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/13150160.html
Copyright © 2011-2022 走看看