1.0 KiB
1.0 KiB
- 链星
inline void add_edge(int u, int v, int w) { edge[cnt].next = head[u]; edge[cnt].v = v; edge[cnt].w = w; head[u] = cnt++; } - Dijkstra最短路
- 要求:边权非负(不仅仅是没有负环)
- 随手敲一个
priority_queue<node, vector<node>, greater<node>> pq; pq.push({s, 0}); dis[s] = 0; while(!pq.empty()) { int u = pq.top().id; pq.pop(); if (vis[u]) continue; vis[u] = true; for (int i = head[u]; i; i = edge[i].next) { int v = edge[i].to; if (dis[v] > dis[u] + edge[i].w) { dis[v] = dis[u] + edge[i].w; pq.push({v, dis[v]}); } } }
- Kruscal生成树
-
std::sort(e + 1, e + e_cnt + 1); int ans = 0, t_cnt = 0; for (int i = 1; i <= n; ++ i) fa[i] = i; for (int i = 1; i <= e_cnt; ++ i) { int fau = findfa(e[i].u); int fav = findfa(e[i].v); if (fau != fav) { fa[fav] = fau; // attention! use fa[find(v)], not fa[v] ans += e[i].w; t_cnt ++; } }
-