http://acm.hdu.edu.cn/showproblem.php?pid=2121
加一个虚梗(原本不存在的点),可以让这个虚根到每个点的距离大于原本所有点所连接的道路花费之和sum,然后计算出的结果减去sum,如果比sum还大就可以认为通过这个虚拟节点我们连过原图的两个点,即原图是不联通的,我们就可以认为不存在最小树形图。那么真正的根呢,在找最小入弧时,如果这条弧的起点时虚拟根,那么这条弧的终点就是要求的根,因为如果存在多解的话,必然存在一个环,环上的顶点都可以做根,但是我们根据最小入边的性质,可知,如果没缩点,必然找不到那个根,因为虚拟根连的边都特别大。但是缩点后,找到的必然是最小的那个序号的根。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 3;
const ll inf = 1e17;
int id[maxn], vis[maxn], pre[maxn], pos;
ll d[maxn];
struct node {
int u, v, w;
} E[maxn * maxn];
ll undirected_