typedef pair PII; PII tmp[MAXN]; int dis[MAXN][MAXN]; int map[MAXN][MAXN]; int vis[MAXN], q[MAXN], inp[MAXN]; int Dfs(int u) { vis[u] = true; int ret = 1; for (int i = 1; i <= n; i++) if (map[u][i] && !vis[i]) ret += Dfs(i); return ret; } int Zhuliu(void) { memset(map, 0, sizeof map); memset(vis, 0, sizeof vis); if (Dfs(1) != n) return -1; int done = 0; while (true) { memset(vis, 0, sizeof vis); memset(inp, 0, sizeof inp); int Ans = 0; for (int i = 1; i <= n; i++) vis[i] = i; for (int i = 2; i <= n; i++) { tmp[i] = PII(1000000000, 0); for (int j = 1; j <= n; j++) if (map[j][i] == 1) tmp[i] = min(tmp[i], PII(dis[j][i], j)); inp[tmp[i].second]++; if (tmp[i].second) Ans += tmp[i].first; } int head = 1, tail = 0; for (int i = 1; i <= n; i++) if (!inp[i]) q[++tail] = i; while (head <= tail) { int now = q[head++]; if (!--inp[tmp[now].second]) q[++tail] = tmp[now].second; } bool ok = true; for (int i = 1, t; i <= n; i++) if (inp[i] > 0) { t = i; ok = false; do { inp[t] = -i; t = tmp[t].second; vis[t] = i; } while (t != i); } if (ok) return Ans + done; for (int i = 1; i <= n; i++) if (inp[i] < 0) { done += tmp[i].first; for (int j = 1; j <= n; j++) if (vis[j] != vis[i]) { if (map[i][j]) { map[vis[i]][vis[j]] = 1; dis[vis[i]][vis[j]] = min(dis[vis[i]][vis[j]], dis[i][j]); } if (map[j][i]) { dis[vis[j]][vis[i]] = min(dis[vis[j]][vis[i]], dis[j][i] - tmp[i].first); map[vis[j]][vis[i]] = 1; } } if (vis[i] != i) for (int j = 1; j <= n; j++) map[i][j] = map[j][i] = 0; } } }