#题面
#题目描述
传说中有一种神奇的算法叫做 Floyd,它竟然能算出一张有向图的传递闭包(一张记录了每个点对之间是否连通的表)!
但是现在出现了一个难题,国王想要建立一个特殊的省供 OIer 生活,省内包含许多城市,国王得到一份「传递闭包」,就是一个 的 矩阵,第 行第 列表示城市 到城市 之间是否有单向需求通讯( 是不需求, 是需求)。如果城市 想与城市 之间通讯,则需要建立一条光缆(由于国王手下的废材工程员,光缆竟然是单向的,如果有一条光缆从 到 ,则 可以发讯息到 ,但是 不能发讯息到 )。光缆是具有连续性的,比如说 有条光缆到 , 有条光缆到 ,则 可以发送讯息到 ,所以国王拿到的那份「传递闭包」中,不可能出现 , 但是 不能到 这种情况。
由于经费问题,所以国王想要用最少的光缆完成城市信息网的建立,然而手下的那群好吃懒做的程序员啊,国王很头疼,所以请到了传说中的哥,要求解决这个问题。
#输入格式
第一行一个整数 。之后的 行每行 个为 或 的整数,表示题中所述的 矩阵。
#输出格式
一行一个整数,表示最少需要多少条光缆。
#输入输出样例
样例输入 #1
3
1 1 1
1 1 1
1 1 1
样例输出 #1
3
#数据规模与约定
对于 的数据,;
对于 的数据,。
#思路
首先,本题的图中存在两种结构:链和环。一个有 个点链需要消耗 条光缆,一个有 个点环需要消耗 条光缆。环可以跑一遍 Tarjan 缩成一个点方便后续处理。
然后可以发现,当存在 和 的光缆时,如果再出现 的通信需求就不需要再新建光缆了,直接复用 的链路即可。于是可以想到在缩完点后的新图上跑一边「反向」的 Floyd,将这种可以通过复用链路的边删掉。
最后统计答案即可。
#代码
1 |
|