P16662 [CSPro 25] 未初始化警告
题目背景
洛谷的测试数据仅供民间交流使用,非官方测试数据。官方评测链接:。
一个未经初始化的变量,里面存储的值可能是任意的。因此直接使用未初始化的变量,比如将其赋值给另一个变量,并不符合一般的编程逻辑。代码中出现这种情况,往往是因为遗漏了初始化语句、或是打错了变量名。对代码中使用了未初始化变量的语句进行检查,可以方便地排查出代码中的一些隐秘 Bug。
题目描述
考虑一段包含 $k$ 条赋值语句的简单代码。该段代码最多使用到 $n$ 个变量,分别记作 $a_1, a_2, \cdots, a_n$;该段代码使用的常量均记作 $a_0$。
第 $i$ 条 ($1 \leq i \leq k$) 赋值语句为 $a_{x_i} = a_{y_i}$,满足 $1 \leq x_i \leq n$、$0 \leq y_i \leq n$,表示将 $a_{y_i}$ 的值赋给变量 $a_{x_i}$。其中 $a_{x_i}$ 被称为该赋值语句的**左值**,一定是个变量;$a_{y_i}$ 被称为**右值**,可以是一个常量或变量。
对于任意一条赋值语句 $a_{x_i} = a_{y_i}$,如果右值 $a_{y_i}$ 是一个变量,则其应该在此之前被初始化过。具体来说,如果变量 $a_{y_i}$ 在前 $i-1$ 条赋值语句中做为**左值**出现过,即存在 $j < i$ 满足 $x_j = y_i$(这里无需考虑第 $j$ 条赋值语句本身是否也有右值未初始化的问题),我们就认为在第 $i$ 条赋值语句中 $a_{y_i}$ 已被初始化;否则,我们认为该条语句存在右值未初始化的问题。
按照上述规则,试统计给定的代码中,有多少条赋值语句右值未被初始化。
输入格式
从标准输入读入数据。
输入的第一行包含空格分隔的两个正整数 $n$、$k$,分别表示变量的数量和赋值语句的条数。
接下来输入 $k$ 行,其中第 $i$ 行 ($1 \leq i \leq k$) 包含空格分隔的两个正整数 $x_i$、$y_i$,表示第 $i$ 条赋值语句。
输出格式
输出到标准输出。
输出一个整数,表示有右值未被初始化问题的赋值语句条数。
说明/提示
### 样例 1 解释
其中第一、二、五条赋值语句右值未被初始化。
### 子任务
$50\%$ 的测试数据满足 $0 < n, k \leq 1000$;
全部的测试数据满足 $0 < n, k \leq 10^5$。