摘要:
POJ_2553这个题目本来是比较容易下手的,最后只需要求所有出度为0的强连通分量所包含的点,然后按字典序输出即可。但是由于一开始用邻接表写代码的时候由于读入边和存储边的写法问题导致我一直TLE,后来终于知道了怎么写才不会TLE,但是还是不太懂其中的原理,听群里人说是因为TLE的写法翻译成汇编语言会多出很多语句。因此,以后写代码的时候,还是尽量少在数组名里面再嵌套数组名。同时看了别人的代码还有一些额外的收获,就是在用邻接矩阵储存无权边时,用bool数组要比int的效率高,数据多时,即使在C里面用char数组都要比int数组的效率有明显的提高(大概20%,当然只是针对这个题目而言)。#inclu 阅读全文
摘要:
POJ_2186 这个题目其实就是求完强连通分量之后,判断一下出度为0的强连通分量是否唯一,如果唯一输出该强连通分量的点数,否则输出0。由于之前求强连通分量的时候是把同一个强连通分量里的数放到一个数组里,然后枚举各个数组之间各元素是否有边来判断各个强连通分量是否连通,由于这样效率比较低,这次超时了。后来看了别人的代码后发现,其实可以找到强连通分量之后,把其中的每个元素都染成一个颜色(开一个数组paint[]来记录染色情况,颜色用num表示,初始化为0),最后枚举所有边,如果一条边(u,v)两个端点的颜色不一样,那么就让outdgr[paint[u]]++。当然,这样最后outdgr中存的并不是 阅读全文
摘要:
POJ_1236 这个题目的TaskA实际上就是在求入度为0的强连通分量的个数,而TaskB实际上就是在求各个强连通分量中入度为0的个数与出度为0的个数的较大值。 同时这个题目与之前做的点双连通的分量有所不同,其中有一点便是在求强连通分量时对于low[u]>dfn[v]时更新low[u]的值,有一个前提条件就是v在栈内,因而要单独用一个数组标记v是否在栈内,而求点双连通分量时则不需要这个数组,因为只要G[u][v]为1,且dfn[v]不为0,那么v一定在栈中。 对于双连通分量为什么不需要标记v是否在栈内,可以先假设v不在栈中但dfn[v]不为0,而如果G[u][v]为1,那么在dfs的过 阅读全文