问题:
给你一个弦图,用最少的颜色染色,使得相连接的两个点颜色不同。
这可以用最大势算法来做,因为一个弦图的最少染色数就是它的团数,如果该图不是弦图就成了一个npc问题。
过程:
首先,对于一个n个点的弦图,每个点的标记为0。然后做n次操作,每一次找一个当前标记最大的点,将所有与它相邻的点的标记全部+1,然后删除这个点。答案就是最大的标记。
这看起来非常简单,但如果暴力的话时间复杂度是O(n^2),就算用了堆优化时间复杂度也只能是O(mlgn),如果是稠密图的话也照样跪。于是可以用链表进行优化。
优化:
维护n个链表来表示当前标记为0~n-1的点。一开始所有的点都在0号链表中。找标记最大的点时只需从当前最大的标记的链表处开始找,如果链表只有表头,那么就将最大的标记-1,继续找,直到找到为止。删除时利用双向链表在原来位置处删除,如果要在某链表处新添加一个点,直接连在该表头的后面就可以了(据说可以不用双向链表,我好像不是很会)。这样时间复杂度就是O(n+m)了。
思考:
貌似dijkstra和prim也可以类似的用链表做,但这样就和边权相关。如果一道题目让你求最短路或最小生成树,n和m极大,但边权极小,那可能可以用最大势算法来做。