function tarjanSCC(graph): index = 0 stack = [] for each vertex v in graph: if v.index is undefined: strongConnect(v)
function strongConnect(v): v.index = index v.lowlink = index index += 1 stack.push(v) v.onStack = true
for each (v, w) in v.edges: if w.index is undefined: strongConnect(w) v.lowlink = min(v.lowlink, w.lowlink) else if w.onStack: v.lowlink = min(v.lowlink, w.index)
if v.lowlink == v.index: start a new SCC repeat w = stack.pop() w.onStack = false add w to current SCC until w == v
intmain(){ int n; scanf("%d", &n); int cnt = 0; for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { scanf("%d", &e[++cnt].z); e[cnt].x = i - 1; e[cnt].y = j; } }
for (int i = 1; i <= n; i++) fa[i] = i;
ll ans = 0; sort(e + 1, e + cnt + 1, cmp); int num = 0; for (int i = 1; i <= cnt; i++) { int x = e[i].x, y = e[i].y, w = e[i].z; int rx = findset(x), ry = findset(y); if (rx != ry) { fa[rx] = ry; num++; ans += w; if (num == n - 1) break; } } printf("%lld\n", ans); return0; }
PRIM(G, r): 1. for each u ∈ G.V: 2. u.key = ∞ 3. u.parent = NIL 4. r.key = 0 5. Q = G.V 6. while Q ≠ ∅: 7. u = EXTRACT-MIN(Q) 8. for each v adjacent to u: 9. if v ∈ Q and w(u, v) < v.key: 10. v.parent = u 11. v.key = w(u, v)
int v[2*MAXN],w[2*MAXN],Next[2*MAXN],head[2*MAXN],idx; voidadd(int ui , int vi , int wi){ v[++idx]=vi; //从1开始存图是为了有些题目0的特判 w[idx]=wi; Next[idx]=head[ui]; head[u]=idx; }