题解 P3640 【[APIO2013]出题人】
这道提答嘛……最短路和染色问题,先看最短路的几种算法(不管正确性与否)
Floyd 算法:裸Floyd,复杂度恒定
优化的 Bellman-ford 算法:就是一个不变化跳循环而已,来个负权照样复杂度
改进的 Dijkstra 算法:用了堆优化,不过遇到负权就GG了。
第1/3个点:干Floyd:
Floyd是恒定
数据最小的话,没有边,刚好101+1+1+2=105个数,OK!
第2/5个点:干Bellman-ford:
复杂度
第2个点要Floyd过,
0号点到299号点连正权边,其它点搞一堆负环+自环+重边,Bellman-ford轻松干掉。
第4/6个点:干Dijkstra:
说了Dijkstra看到负权就GG,所以构造一堆0边诱惑他,然后再让他从右边的点进去,举个栗子:
那么就先把它拐到4,发现路长为0,然后走2~3是最短的,拐到3,开始觉醒后,发现0~1再到2,路长为-2,再走2~3,傻傻地Dijkstra就被坑了,
这样多来几次就是指数级,卡卡常就可以了。
然后是染色问题:
Gamble1是恒过器,Gamble2是恒挂器,所以第7个点就是要算法T掉,第8个点就是要算法A掉。
第7个点来个完全图,那么多颜色估计染不到了。
第8个点——因为不能有重边——所以说,因为,所以就染2种颜色——蓝(男)色和绿(女)色。
那么每个蓝色点和绿色点连一条边,也就是说分成两组,同组之间不连边,异族之间连边,然后Recursive-Bactraking就过了。