这是一个图论杂题,似乎涉及图的遍历。

原题地址:http://codeforces.com/problemset/problem/118/E

题目的大意是有 1 个含 n 个地点,m 条路的连通无向图,需要把它的每一条边都变成有向的,然后使得它依然连通。问你之后每一条边的方向是什么。

如果没有方案,输出 0; 如果有方案,输出其中的任何一个。输出方案的方式是每行两个数 a, b, 表示某条路的方向是从 a 到 b. 然后你可以按照任何顺序输出这些路。

样例输入是:

6 8
1 2
2 3
1 3
4 5
4 6
5 6
2 4
3 5

样例输出是:

1 2
2 3
3 1
4 5
5 6
6 4
4 2
3 5

第二组样例输入是:

6 7
1 2
2 3
1 3
4 5
4 6
5 6
2 4

第二组样例输出是:

0

我一开始的想法比较复杂,但是感觉还是没有啥错的。后来看了一下别人的代码,真是吓一跳,短。

那题的思路就借鉴了 Kosaraju 算法的思想,首先在无向图上遍历一遍,不要遍历重复的点,但是遍历到的边都要记下遍历时的方向,并且记下方向的边也无需再次遍历。然后我们可以得到一个有向图。显然这个有向图可以从起始点遍历到其它任何一个点。

Kosaraju 的思想有一部分是,如果一个有向图,从某个点可以到任意另一个点的话,那么,将这个有向图的所有的边反转,还能够中这个顶点走到任意另一个顶点,那么,原来的有向图是连通的。

然后,如果连通,就可以把所有的有向边输出;如果不连通,就输出 0.

原创文章,转载请注明来源:http://euyuil.com/2679/codeforces-118e-bertown-roads/