---
# System prepended metadata

title: 真‧基礎圖論
tags: [圖論]

---

---
tags: 圖論
title: 真‧基礎圖論
description: 圖論簡介
---

# 圖論1
[給個玩具](https://domen111.github.io/Draw-Graph/)
1 2 8
2 4 3
1 3 4
4 5 1
4 6 -6
3 5 -2
![](https://i.imgur.com/fmCs9I2.jpg)

## 介紹幾個名詞
- 節點(node / vertex)：你看到①②③④⑤⑥的地方，就是節點
- 邊(edge)：你看到的每一條線
- 邊權(weight)：你看到線上的每個數字

## 圖的儲存
```cpp=
//version 1
int edges[1e3][1e3];
edges[A][B] = W;//A -> B
edges[B][A] = W;//B -> A

//version 2
vector<int> edges[1e5];
vector<int> weights[1e5];
edges[A].push_back(B);//edges[A] = {B}
weights[A].push_back(W);//weights[A] = {W}
edges[B].push_back(A);//edges[B] = {A}
weights[B].push_back(W);//weights[B] = {W}
```

## 圖的走訪
假設從①開始走訪
```cpp=
vector<int> edges[1e5];
vector<int> weights[1e5];

bool vis[1e5];//vis[U] = true 時表示節點U已經走訪過

void dfs(int U){
    vis[U] = true;
    for(int i = 0; i < edges[U].size(); ++i){
        int nxt = edges[U][i];
        if(!vis[nxt]){
            dfs(nxt);
        }
    }
    
    // 看情況做或不做
    vis[U] = false;
}
```

## 樹
def: 沒有環的無向圖

### 介紹幾個名詞
- 根節點(root)：起點（只有一個點）
- 葉節點(leaf)：終點（不只一個點）
- 父節點(parent)：以根節點遍歷，A->B，且先走訪到A時，A為B的父節點（對於每個節點而言，只有一個）
- 子節點(child)：以根節點遍歷，A->B，且先走訪到A時，B為A的子節點（對於每個節點而言，有0或多個）
- 子樹(subtree)：一個節點的child當root的樹

詳情見樹筆記：https://hackmd.io/D7-rINgnTq62HjKp62sfjQ


# CF 1398C
sum[i] = a[1]+a[2]+...+a[i];
區間和基本算法: 區間 l~r 和為 sum[r] - sum[l-1]

sum[r] - sum[l-1] = 0 => sum[r] == sum[l-1]
區間 l~r 的和為0，當且僅當 sum[r] == sum[l-1]

for i in {1~n}: ans += $\|$ {sum[j] where (j < i)} $\|$
```cpp=
int cnt[1e6+5];//cnt[5] = 3 代表前綴和為5的有3個
```