<题目链接>

题目大意:

给定一颗无向树,树的边权只要0/1两种情况,现在问你这棵树上存在多少对有序对<u,v>,满足u-->v的路径上,如果出现边权为1的边之后,就不能出现边权为0的边,问你这样的有序对的个数。

解题分析:

本题可以用并查集和树形DP来求解。

并查集就是用两类并查集来分别维护每个点所在的连通块0和连通块1的信息(连通块0表示之间的点都是通过边权为0的边相连接,连通块1类似)。

然后对于每个点,考虑三种情况:

1)该点所在的连通块0的所有节点相互之间自行匹配,假设该点所在连通块0点数为sz,有序对数就是有向完全图的有向边边数$(sz*(sz-1))$(这种情况每个连通块0只需要考虑一次);

2)对于每个点所在连通块1的情况考虑,与上面类似;

3)每个点作为所在连通块0和1的交叉点,情况数就是 $(sz0-1)*(sz1-1)$。

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 2e5+;
ll sz[N][];
int n,fa[N][];
//第二维表示是第几类连通块,0表示边权为0的联通块,1表示边权为1的
int find(int u,int x){ return u==fa[u][x]?u:fa[u][x]=find(fa[u][x],x); } inline void Union(int u,int v,int x){
int f1=find(u,x),f2=find(v,x);
if(f1!=f2){
fa[f2][x]=f1;
sz[f1][x]+=sz[f2][x]; //记录连通块中的节点个数
}
}
int main(){
ios::sync_with_stdio(false);cin.tie();cout.tie();
cin>>n;
for(int i=;i<=n;i++){
sz[i][]=,sz[i][]=;
fa[i][]=i,fa[i][]=i;
}
for(int i=;i<n;i++){
int u,v,w;cin>>u>>v>>w;
Union(u,v,w); //将对应分类的连通块合并
}
ll ans=;
for(int i=;i<=n;i++){
if(fa[i][]==i)ans+=sz[i][]*(sz[i][]-); //讨论块内的有序对,有序对数就是有向完全图的边数
if(fa[i][]==i)ans+=sz[i][]*(sz[i][]-);
int f0=find(i,),f1=find(i,);
ans+=(sz[f0][]-)*(sz[f1][]-)*1LL; //然后将每个点作为两类连通块的交叉点的情况考虑一下
}cout<<ans<<endl;
}

树形DP做法待补:

Codeforces 1156D 0-1-Tree ( 并查集 || 树形DP )的更多相关文章

  1. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  2. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

  3. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  4. HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  5. BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集+树形DP

    BZOJ_2443_[Usaco2011 Open]奇数度数 _并查集. Description 奶牛们遭到了进攻!在他们的共和国里,有N(1 <= N <=50,000)个城市,由M(1 ...

  6. P2700逐个击破(并查集/树形dp)

    P2700 逐个击破 题目背景 三大战役的平津战场上,傅作义集团在以北平.天津为中心,东起唐山西至张家口的铁路线上摆起子一字长蛇阵,并企图在溃败时从海上南逃或向西逃窜.为了就地歼敌不让其逃走,老毛同志 ...

  7. Codeforces Round #527 F - Tree with Maximum Cost /// 树形DP

    题目大意: 给定一棵树 每个点都有点权 每条边的长度都为1 树上一点到另一点的距离为最短路经过的边的长度总和 树上一点到另一点的花费为距离乘另一点的点权 选定一点出发 使得其他点到该点的花费总和是最大 ...

  8. Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集

    题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...

  9. Codeforces Round #363 (Div. 2)D. Fix a Tree(并查集)

    D. Fix a Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

随机推荐

  1. 网络拓扑_VLAN与Trunk配置

    实验目的: 1.实现VLAN10的两台主机互通; VLAN20的两台主机互通; 2.VLAN10与VLAN20主机不能互通. 拓扑图: 步骤: 1.依图配置PC1,PC2,PC3,PC4的IP,掩码, ...

  2. 【改】linux中分区的概念

    1.目录和分区 区别:Linux的分区是物理上的概念,从物理上将存储空间分开:Linux的目录是逻辑上的概念,Linux的目录树实际上是一个分区之间的数据逻辑结构关系,不是物理结构: 联系:一个分区必 ...

  3. rabbit localhost不能登录

    解决方案 将C:\Users\{用户名}\.erlang.cookie 复制到 C:\Windows\System32\config\systemprofile 目录. 重启rabbitMQ服务 [转 ...

  4. windowserver 常用命令

    1.查看端口占用: netstat -ano | findstr "服务端口号"2.查看程序运行id: tasklist | findstr  nginx 3.杀死进程  tskk ...

  5. -bash: findstr: command not found 问题解决

    今天有个任务,需要获取apk的版本信息,百度之后说是之下下面的命令就行 adb shell dumpsys package com.baidu.searchbox | findstr versionC ...

  6. wine安装与配置

      1. 安装wine32dpkg --add-architecture i386 && apt-get update && apt-get install wine3 ...

  7. Java浏览器弹出下载框,多个文件导出压缩包

    项目里一直有这个功能,也一直没怎么注意,今天研究了一下 依据逻辑往下走: 首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管: Map<String, Object> ...

  8. Java中的栈和队列

    栈: public class Stack<E> extends Vector<E> { // 使用数组实现栈 // 构造一个空栈 public Stack() { } // ...

  9. Python3解leetcode Count Binary Substrings

    问题描述: Give a string s, count the number of non-empty (contiguous) substrings that have the same numb ...

  10. 关于Calendar和Reminder(日历和提醒)编程指南

    Event Kit框架使你能访问用户的Calendar.app和Reminders.app信息.虽然这是两个不同的app,但是他们使用相同的框架处理数据.类似地,存储这些数据的数据库,被称为日历数据库 ...