这道题的意思就是给出一个有向无环图的传递闭包,要求出一个最小边的有向图满足这个矩阵,求出最少的边数是多少。
flyod 的 作用就是讲一个有向图转化成传递闭包,那么这么不就是一个逆过程吗。第一个想法,如果map[i][f] == 1,那么就先将所有的边加到图中,然后开始删边,如果i到k有边,k到f有边,那么i到k的边就是多余的,可以删去,而且这个过程是贪心的,删了这条边并没有实质性的印象,而且删的顺序也并没有关系,这一步是贪心的做法,可以多删一条算一条。
恩 那么写了算法之后得到了wrong answer,问题出在哪里,那就如果形成了一个环,那么其中一条边就是可以由其他边走到,那么在操作之后整个环都被删掉了,所以说我们刚才的算法仅对于无环图是起作用的。
那么有环怎么去处理呢,强连通缩点,缩完之后很显然,一个n个点构成的强连通分量里面仅最少需要n条边构成一个环即可,然后对于缩完点之后的图我们再采用上面的o(n^3)的方法暴力删去每一条边,整个算法就ok了。