就是圖上的每個點
點與點之間的連線
邊上所帶的數字,常常用來表示時間或是花費
點上所帶的數字,常常用來表示花費
一個點所連到的邊數
一條頭尾同點的連線
就是連到自己的邊
邊沒有方向的圖
邊有方向的圖
連續邊的序列
連續邊的序列
一個圖中的選某些點與邊構成的圖(也可以全選or不選)
Text
Text
利用一般的陣列,一一對應表達(此為是否連線)
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0 | 0 | 0 |
| 2 | 1 | 0 | 1 | 1 | 1 | 0 |
| 3 | 1 | 1 | 0 | 0 | 0 | 0 |
| 4 | 0 | 1 | 0 | 0 | 1 | 0 |
| 5 | 0 | 1 | 0 | 1 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 | 1 | 0 |
利用一般的陣列,一一對應表達(此為邊權)
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | 0 | 4 | 5 | 0 | 0 | 0 |
| 2 | 4 | 0 | -1 | -2 | 6 | 0 |
| 3 | 5 | -1 | 0 | 0 | 0 | 0 |
| 4 | 0 | -2 | 0 | 0 | 777 | 0 |
| 5 | 0 | 6 | 0 | 777 | 0 | 8 |
| 6 | 0 | 0 | 0 | 0 | 8 | 0 |
利用一般的陣列,一一對應表達(此為有向圖、邊權)
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | 0 | 5 | 2 | 0 | 0 | 0 |
| 2 | 0 | 0 | -1 | 86 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | -2 | 0 |
| 5 | 0 | 6 | 0 | 0 | 0 | 3 |
| 6 | 0 | 0 | 0 | 0 | 0 | 0 |
int G[N][N];
for (int i = 1; i <= n; i++) {
int a, b;
cin >> a >> b;
G[a][b] = 1;
//沒邊權
}
for (int i = 1; i <= n; i++) {
int a, b, w;
cin >> a >> b >> w;
G[a][b] = w;
//帶邊權
}利用vector儲存一個點連出去的其他點,有向圖同理
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
如果有權重的話,可以利用pair來存值
| 1 | (2,4) | (3,5) | ||
| 2 | (1,4) | (3,-1) | (4,-2) | (5,6 |
| 3 | (1,5) | (2,-1) | ||
| 4 | (2,-2) | (5,777) | ||
| 5 | (2,6) | (4,777) | (6,8) | |
| 6 | (5,8) |
vector<int> vec[N];
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
vec[a].push_back(b);
} // 不帶權
vector<pair<int,int>> v[N];
for (int i = 0; i < m; ++i) {
int a, b, w;
cin >> a >> b >> w;
vec[a].push_back({b,w});
vec[b].push_back({a,w});
} // 帶權| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 3 | 4 | 5 |
| 3 | 1 | 2 | ||
| 4 | 2 | 5 | ||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
bool vis[N];
vector<int> vec[N];
void dfs(int x) {
vis[x] = 1;
for (int i:vec[x]) {
if (!vis[i]) dfs(i);
}
for(int i=0;i<vec[x].size();i++) {
if (!vis[vec[i]]) dfs(vec[i]);
}
}| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
| 1 | 2 | 3 | ||
| 2 | 1 | 5 | ||
| 3 | 1 | |||
| 4 | 5 | |||
| 5 | 2 | 4 | 6 | |
| 6 | 5 |
vector<int> vec[N];
bool vis[N];
queue<int> que;
void BFS(int x){
for(int i:vec[x]){
if(!vis[i]){
vis[i]=1;
que.push(i);
}
}
if(que.size()){
int u = que.front();
que.pop();
BFS(u);
}
}藍色是起點、黑色是目標、紅色是大火
一秒後,森林的情況
兩秒後,森林的情況
三秒後,森林的情況
維護的是「人在第T秒可以走到的地方」與
「火在第T秒會燒到的地方」
火先燒,人再走=>火先放進Queue再放人