题目:http://code.google.com/codejam/contest/dashboard?c=842485#s=p2
题目大意是,能否从用户选定的一个点A出发,遍历所有的路径,每条路径只能遍历一次,最后返回点A,如果不能,问需要添加的最少的路径数?每两个点之间可以添加任意条路径。
是《离散数学》图论的知识,第一,首先必须是连通图,因为要遍历所有的路径。其次,因为从点A出发,又要重新返回点A,所以所有的点的度数必须为偶数。
因此我的做法是,先找出所有的联通子图,统计连通子图能否形成欧拉回路,即奇数度数点的个数,连接n个连通子图至少需要n条边,而这那条边能够帮助一个连通子图增加一个度数,因此,连接一个连通子图至少需要两条边,可以增加两度,也就是减少一条边。因此最后的连通子图与边的关系可以确定为,sum(edge[i]-1) + cl. if cl >= 2, edge[i] > 0. edge[i]表示第i个连通子图的变成欧拉回路图需要边的数目(也即是奇数度节点的个数/2),cl表示,连通子图的个数
代码如下: