hdu 3721
题意:
给一棵树,可以移动树上的一条边,必须保证移动之后的图还是一棵树,问如何移动才能使得移动之后的树的直径最短
思路:
枚举每条边,如果移除了这条边,会将这棵树分成两部分,新增加的边必须是连接这两个部分的边,这样才能保证新形成的是一棵树,那么这样对于两个部分分别求出这个部分上面的点,满足这个点是这个部分中到其余所有点的最长的距离最短的点,显然新增加的边要连接这两个点才能使得新形成的树的直径最短
那么问题就变成了给定一棵树,求出一个满足上述条件的点了,其实只要先求出这棵树的直径,那么要求的点就一定是直径中心附近的那两个点之一了,证明如下:
假设要求的点不是直径上面的点,那么由于原图是一棵树,取这个点到直径的最短路径,交直径与一个点,这个点到其他点的最长距离一定大于交点到其他点的最长距离,这样就说明了要求的点一定是直径上面的点,既然是直径上面的点,因为直径是一条链,显然它一定是中心附近的点
求直径的方法直接bfs两次就可以了