原题传送门

题目描述

对于一个城市来说,排水系统是极其重要的一个部分。

有一天,小 C 拿到了某座城市排水系统的设计图。排水系统由 nn 个排水结点(它们从 1 \sim n1∼n 编号)和若干个单向排水管道构成。每一个排水结点有若干个管道用于汇集其他排水结点的污水(简称为该结点的汇集管道),也有若干个管道向其他的排水结点排出污水(简称为该结点的排出管道)。

排水系统的结点中有 mm 个污水接收口,它们的编号分别为 1, 2, \ldots , m1,2,…,m,污水只能从这些接收口流入排水系统,并且这些结点没有汇集管道。排水系统中还有若干个最终排水口,它们将污水运送到污水处理厂,没有排出管道的结点便可视为一个最终排水口。

现在各个污水接收口分别都接收了 11 吨污水,污水进入每个结点后,会均等地从当前结点的每一个排出管道流向其他排水结点,而最终排水口将把污水排出系统。

现在小 C 想知道,在该城市的排水系统中,每个最终排水口会排出多少污水。该城市的排水系统设计科学,管道不会形成回路,即不会发生污水形成环流的情况。

输入格式

第一个两个用单个空格分隔的整数 n, mn,m。分别表示排水结点数与接收口数量。
接下来 nn 行,第 ii 行用于描述结点 ii 的所有排出管道。其中每行第一个整数 d_idi​ 表示其排出管道的数量,接下来 d_idi​ 个用单个空格分隔的整数 a_1, a_2, \ldots , a_{d_i}a1​,a2​,…,adi​​ 依次表示管道的目标排水结点。
保证不会出现两条起始结点与目标结点均相同的管道。

输出格式

输出若干行,按照编号从小到大的顺序,给出每个最终排水口排出的污水体积。其中体积使用分数形式进行输出,即每行输出两个用单个空格分隔的整数 pp,qq,表示排出的污水体积为 \frac{p}{q}qp​。要求 pp 与 qq 互素,q = 1q=1 时也需要输出 qq。

输入输出样例

输入#1

5 1
3 2 3 5
2 4 5
2 5 4
0
0

输出#1

1 3
2 3

其余样例见附件water.zip​​​​​​

解法:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 100005
#define ll long long
//由于数据过大,超过ull,使用__int128
//注:__int128不属于c++标准库,只支持位运算和四则运算,且必须在G++64位下才能编译
#define lll __int128
//#define lll long double
#define ull unsigned long long
#define il inline
#define rg register
using namespace std;
//快写
class Qout
{inline void write(int x){static int sta[35];rg int top(0);do{sta[top++] = x % 10, x /= 10;} while (x);while (top)putchar(sta[--top] + 48); // 48 是 '0'}public:
#define endl '\n'//重载__int128输出模块inline Qout &operator<<(__int128 x){static int sta[35];rg int top(0);do{sta[top++] = x % 10, x /= 10;} while (x);while (top)putchar(sta[--top] + 48); // 48 是 '0'return *this;}inline Qout &operator<<(int x){write(x);return *this;}inline Qout &operator<<(char c){putchar(c);return *this;}inline Qout &operator<<(const string &str){rg int len = str.length();for (rg int i = 0; i < len; i++)putchar(str[i]);return *this;}inline Qout &operator<<(char *str){rg int len = strlen(str);for (rg int i = 0; i < len; i++)putchar(str[i]);return *this;}
} qout;
int n, m;
//辗转相除法求最大公约数
lll gcd(lll x, lll y)
{while (y ^= x ^= y ^= x %= y);return x;
}
//最小公倍数
lll lcm(lll x, lll y)
{return x / gcd(x, y) * y;
}
//节点信息结构体
struct node
{int ru;//入度数量int n;//相连节点数int d[6];
} a[N];
//模拟分数
struct edge
{lll fenmu;//分母lll fenzi;//分子edge(){fenmu = 1;fenzi = 0;}edge(lll x) { fenzi = x, fenmu = 1; }void yufen()//约分模块{lll g = gcd(fenmu, fenzi);fenmu /= g, fenzi /= g;}
};
//重载edge类型的‘+’运算符(分数加法)
il auto operator+(edge a, edge b)
{//先通分lll l = lcm(a.fenmu, b.fenmu);lll fa = l / a.fenmu, fb = l / b.fenmu;edge ans;ans.fenmu = l;ans.fenzi = fa * a.fenzi + fb * b.fenzi;//再约分ans.yufen();return ans;
}
//记录每个节点的水量
edge water[N];
//x指当前节点编号,f指流入水量(分数表示)
void dfs(int x, edge f)
{//当前节点总水量加上新流入水量water[x] = water[x] + f;water[x].yufen();//如果相连节点数为零(最终排水口)if (a[x].n == 0)return;//返回for (int i = 1; i <= a[x].n; i++){//有n个相连节点,对于每一个相连的节点,流入新流入水的1/nedge e;e.fenzi = f.fenzi;e.fenmu = f.fenmu * a[x].n;//别忘约分e.yufen();//继续深搜dfs(a[x].d[i], e);}
}
int main()
{cin.sync_with_stdio(false);cin >> n >> m;for (int i = 1; i <= n; i++){int d, x;cin >> d;a[i].n = d;for (int j = 1; j <= d; j++){cin >> x;a[i].d[j] = x;a[x].ru++;}}for (int i = 1; i <= n; i++)if (!a[i].ru)//如果是输入节点dfs(i, 1);//从这个节点开始深搜,初始水量为1for (int i = 1; i <= n; i++)if (!a[i].n)//如果是输出节点,输出水量qout<< water[i].fenzi << " " << water[i].fenmu << endl;system("pause");return 0;
}

Luogu P7113 [NOIP2020] 排水系统 题解相关推荐

  1. P7113 [NOIP2020] 排水系统 (DFS)(90Point简易算法)

    题目描述 对于一个城市来说,排水系统是极其重要的一个部分. 有一天,小 C 拿到了某座城市排水系统的设计图.排水系统由 nn 个排水结点(它们从 1 \sim n1∼n 编号)和若干个单向排水管道构成 ...

  2. 【luogu P5022 旅行】 题解

    题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...

  3. Luogu P2708 硬币翻转 题解

    Luogu p2708题解 思路: 由于我们这个题目的长度不知道,所以我们不能一次性输入所有的硬币的状态,也许会爆数组(Ps:我没试过我不是知道).所以我们为了保险采取用getchar()一个一个读入 ...

  4. 【luogu P2169 正则表达式】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2169 tarjan缩点 + SPFA 缩完点之后加边注意别写错. 也可以不用建两个图,可以在一张图上判断是否 ...

  5. 【luogu P3959 宝藏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...

  6. [Luogu]P1007 独木桥(C++题解)

    文章目录 Part 0 独木桥 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 Part 1 Part2 Part 3 核心代码 Part 4 AC代码: P ...

  7. 【后缀自动机】Luogu P3975 [TJOI2015]弦论题解

    [TJOI2015]弦论 题目描述 为了提高智商,ZJY 开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 nnn 的字符串,求出它的第 ...

  8. Luogu P1879玉米田题解

    题目在这里喔 题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上 ...

  9. Luogu P5652 基础博弈练习题 (博弈论、图论)

    题目链接 https://www.luogu.org/problem/P5652 题解 好题,想了四小时-- 首先考虑如何判断胜负: 首先假设只有一个柱子,那就是奇败偶胜.不难发现最后一个奇数后面的偶 ...

最新文章

  1. 重磅直播|慕尼黑工业大学博士详解室内SLAM中的几何约束
  2. php mysql 检索跳转_jQuery+AJAX+PHP+MySQL数据库开发搜索功能,无跳转无刷新搜索。...
  3. 13.6 Thread类自定义线程类
  4. 0-1背包问题优化算法详解
  5. Python如何防止sql注入
  6. php opcache 详解
  7. django-模板语言-循环语句
  8. mtk 驱动(55)---mtk指纹移植
  9. C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
  10. 服务器迁移虚拟化实施方案,服务器虚拟化项目P2V实施及迁移方案v8(31页)DOC
  11. js获取当前页面高度
  12. android木马的制作方法,实现木马病毒的详细步骤
  13. 内存颗粒位宽和容量_SDRAM内存模组的物理Bank与芯片位宽(高手进阶,终极内存技术指南——完整/进阶版)...
  14. python中摄氏度华氏度相互转换
  15. justinmind夜话:数据母板系列视频教程之原型设计二十一条军规
  16. Longhorn配置参数详解
  17. 做好社群营销的4点策略
  18. 中文模糊查找(C语言)+ 链表操作
  19. uni-app学习日记7
  20. AFNetworking 返回3840

热门文章

  1. 求最大公约数几种方法
  2. vue--实现todo案例
  3. et99 php,ET99加密狗模拟之读取数据
  4. 计算机入门游戏,计算机DIY从入门到精通:不同用户怎么选择合适自己的CPU
  5. cad中lisp文件给恶作剧_最整人的5个CAD问题及解决办法!
  6. python廖雪峰教程学习:Day 1
  7. 高斯模糊java代码_Java 实现高斯模糊算法
  8. 国美金融贷款为虚拟机执行 Java 方法(国美金融贷款存储)
  9. 微信公众号如何设置弹幕效果
  10. 使用 Windows 10 中的快捷键(Windows 键的妙用)