LogSeq/pages/基础图论算法.md
2023-07-01 23:59:11 +08:00

42 lines
1.0 KiB
Markdown

- 链星
```c
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最短路
- 要求:边权非负(不仅仅是没有负环)
- 随手敲一个
```c
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生成树
- ```c++
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 ++;
}
}
```