OJ 题意全靠猜。
数据范围全靠猜。
重边自环全靠猜。
有向无向全靠猜。
输入结束全靠猜。
错别字意全靠猜。那要不要猜一猜考试成绩呢。
Problem A
判断输入 parent-child 关系是否构成一棵树。要求使用并查集。
搜到了原题。算法是:
Step 1:对每对输入的根节点标记表示这些节点出现过,进行并操作。并操作时两个节点不能有相同的根节点否则将构成环;假设b节点要接到a上,则要保证b节点是一个根节点,否则若进行并操作,b将会有两个父节点;若无以上情况,则可以合并两棵树。
Step 2:每组数据输入结束后,要计算整个图中的根节点总数,若根节点总数不为1,则构成的图不是一棵树。
Step 3:根据以上判断就可以输出结果了,每组结果输出后要初始化数据。
无法理解为什么要用并查集,明明找个入度为 0 的点搜索一下就 O(n) 了。
而且这个解法无法处理重边,题面也没说有没有重边自环,否则也不应该出现编号为 0 的点。
代码请看上面原题链接。
Problem B
给一个无向图,问是否存在从 Alice 家到 Bob 家再到学校的结点不重复的路径。
每个点拆点,流量为 1。源点流向 Bob 家,流量为 2。Alice 家和学校流向汇点,流量为 1。
判断最大流是否为 2。
现场默写 dinic,居然写对了。
1 |
|
Problem C
给一棵树,每个点有一个权值,若选择一个点则其 parent 不能被选,问权值和最大的方案。
树形 DP,dp[i][0/1] 表示点 i 是否被选时子树的最大值。转移方程:
$dp[i][0]=\sum\limits_{child\ j}\max(dp[j][0],dp[j][1]),$
$dp[i][1]=value[i] + \sum\limits_{child\ j}dp[j][0].$
出题人又不知道树的边数是 n-1 了。
1 |
|
Problem D
给一个无向图,其中一些点为起点,一些为终点。问任意一对起点终点直接的最短距离。要求使用 Dijkstra。
源点和起点之间连边,代价为 0;终点和汇点之间连边,代价为 0。求 S 到 T 的最短路。
或者只建源点,终点判断一下。
1 |
|