首页 > 其他分享 >P5836 [USACO19DEC] Milk Visits S - 洛谷题解

P5836 [USACO19DEC] Milk Visits S - 洛谷题解

时间:2023-09-22 18:23:00浏览次数:42  
标签:USACO19DEC 洛谷 int 题解 Visits P5836 Find

 题目链接 :[P5836] USACO19DEC] Milk Visits S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这道题可以用并查集来解决。 题目中每个结点只有两个状态:H和G。那么我们可以推断出,只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)与所需状态不同才可以输出0。

我们利用并查集来设置连通块,状态相同并且相连的两个结点合并成一个合集,最终查找起点和终点是否在同一合集以查看他们之间是否为同一连通块。 之后通过前面讲过的方法来得到结果。

#include<cstdio>
using namespace std;
int n, m;
int f[100005];

int Find(int x) {
    return x == f[x] ? x : f[x] = Find(f[x]);
}
void merge(int a, int b) {
    f[Find(a)] = Find(b);
}

int main() {
    scanf("%d %d", &n, &m);
    getchar();
    char farm[n + 1];
    for(int i = 1; i <= n; i++) {
        f[i] = i;
        scanf("%c", farm + i);
    }
    for(int i = 1; i < n; i++) {
        int a, b;scanf("%d %d", &a, &b);
        /* 设置连接块 */
        if(farm[a] == farm[b]) merge(a, b); 
    }
    for(int i = 1; i <= m; i++) {
        int a, b;char c;scanf("%d %d %c", &a, &b, &c);
        /*只有当起点和终点间每个结点的状态相同但是起点(或者终点或起点到终点之间的某一点)
        与所需状态不同才可以输出0。*/
        if(Find(a) == Find(b) && farm[a] != c) putchar('0');
        else putchar('1');
    }
    return 0;
}

 

标签:USACO19DEC,洛谷,int,题解,Visits,P5836,Find
From: https://www.cnblogs.com/DreamOfSJ/p/17723096.html

相关文章

  • 苏格拉底问答,问题解决
     ......
  • 题解 P8670 [蓝桥杯 2018 国 B] 矩阵求和
    题目描述\[\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)^2\]具体思路solution1显然可以每次枚举\(\gcd(i,j)\)的取值。\[\sum_{k=1}^nk^2\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=k]\]令\(i=\lfloor\frac{i}{k}\rfloor\),\(j=\lfloor\frac{j}{k}\rfloor\)。\[\sum......
  • 【UVA 11175】From D to E and Back 题解(图论)
    取具有n个顶点和m条边的任意有向图D。你可以在以下方式。E将有m个顶点,每个顶点对应于D的每条边。例如,如果D有一条边uv,那么E将有一个叫做uv的顶点。现在,每当D有边uv和vw时,E就会有边顶点uv到顶点vw。E中没有其他边。你将得到一张E图,并且必须确定E是否有可能是某些有向图D的图的卧......
  • CF38H 题解
    problem&blog。远古场翻到的一个不错的题,提供一个好想很多的做法。求出任意两点的路径在全部路径中是第几个。然后随便找两个人,钦定他们是Au吊车尾与CuRank1。这样子就可以直接求出全部人可以是否可以拿AuAgCu了。然后就是傻子DP了,往状态里塞Au与Ag的人数,转移......
  • MUH and Cube Walls 题解
    MUHandCubeWalls前言怎么题解区同质化这么严重,16篇题解全是差分+KMP,就没有人写别的做法吗。(好吧其实是我一开始没想到差分才有了这么多奇怪做法)题目大意给定两个序列\(a,b\),求\(b\)在\(a\)中出现了多少次。我们定义\(b\)在\(a\)的出现次数为:\[\sum_{i=1}^n......
  • c#Winform窗体实际运行大小与size属性设置不一致问题解决
    privatevoidForm1_Load(objectsender,EventArgse){RectangleScreenArea=System.Windows.Forms.Screen.GetWorkingArea(this);//GetWorkingArea()检索显示器的工作区(工作区是显示器的桌面区域,不包括边界、标题栏、任务栏、停靠窗口和停靠......
  • 洛谷P5104 红包发红包
    我们假设他是离散的设[0,w]这个区间有i个数那么第一个人期望获得的钱数\(E(1)=\frac{1}{i}\sum_{j=1}^{i}\frac{w}{i}j=\frac{w(1+i)}{2i}\)因为这个区间实际上有无数个数,故令i趋于无穷,有\(E(1)=\frac{w}{2}\)那么轮到第二个人的时候还剩下\(w-\frac{w}{2}=\frac{w}{2}\)这么......
  • vue学习问题解决
    报错errorComponentname"Index"shouldalwaysbemulti-wordvue/multi-word-component-names解决方法1、问题说明:在创建组件命名时,引用index.vue的过程中报错;2、报错的原因及分析:其一、报错的全称为:errorComponentname"index"shouldalwaysbemulti-wordvue/multi-w......
  • 容斥原理应用Acwing890借鉴题解
    参考文献简单的容斥原理介绍请看下图:C++代码简单的容斥原理介绍请看下图:本题思路:将题目所给出的m个数可以看成是m位的二进制数,例如当p[N]={2,3}时,此时会有01,10,11三种情况而二进制的第零位表示的是p[0]上面的数字2,第1位表示p[1]上面的数字3所以当i=1时表示只选择2的......
  • 题解 ARC141D【Non-divisible Set】
    这个题不是网络流。problem我们说一个集合\(D\)是一个好的集合,当不存在集合中的两个不同元素\(a,b\)使得\(a\)是\(b\)的约数。给定\(N\)个整数的一个集合\(S\),值域均落在\([1,2*M]\)内。对\(S\)中的每个元素\(A_i\)询问:是否存在一个恰好包含\(A_i\)的\(......