intKruskal(){ int tot = 0,ans = 0; sort(edges+1,edges+1+n); for (int i = 1;i <= m;++i) { int u = edges[i].u,v = edges[i].v,w = edges[i].w; if (find(u) != find(v)) { ans += w; ++tot; } if (tot == n-1) { break; } } return ans; }
拓扑排序
用来巧妙求解DAGdp等,利用BFS实现,同样可以用DFS实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int cnt[N]; voidtoposort(int s){ queue <int> q; for (int i = 1;i <= n;++i) { if (!cnt[i]) q.push(i); } while (!q.empty()) { int u = q.front(); for (int i = hd[u];i;i = nxt[i]) { int v = to[i]; if (--cnt[v] == 0) { q.push(v); } } } }
voiddfs1(int u,int f){ son[u] = 0; siz[u] = 1; dep[u] = dep[f] + 1; fat[u] = f; for (int i = hd[u];i;i = nxt[i]) { int v = to[i],w = edg[i]; if (v != f) { dfs(v,u); siz[u] += siz[v]; if (siz[v] > siz[son[u]]) { son[u] = v; } } } }
voiddfs2(int u,int f){ dfn[u] = ++cnt; if (u == son[f]) { top[u] = top[f]; } else { top[u] = u; } if (son[u]) { dfs2(son[u],u); } for (int i = hd[u];i;i = nxt[i]) { int v = to[i],w = edg[i]; if (v != f && v != son[u]) { dfs2(v,u); } } }