邻接表与邻接矩阵空间复杂度直观差异
邻接表 空间复杂度 O(N+M) 邻接矩阵 空间复杂度O(N*N)
//邻接表
#include <bits/stdc++.h>
using namespace std;
const int N = 5001;
int bfs(int n, vector<vector<int>>& adj) {
int d[N];
memset(d, -1, sizeof(d)); //记录1到每个点的距离,-1表示未访问。
int start = 1; //起点为1号
d[start] = 0; //1到1距离为0
queue<int> q;
q.push(start);
while (!q.empty()) {
start = q.front(); //取队头结点
q.pop();//取完出队
for (int i = 0; i < adj[start].size(); i++) {
int curNode = adj[start][i];
if (d[curNode] == -1) {
d[curNode] = d[start] + 1;
if (curNode == n) return d[curNode]; //若到达n号 返回距离
q.push(curNode);
}
}
}
return -1;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> adj(N);//邻接表
for (int c = 0; c < m; c++) {
int i, j;
cin >> i >> j;
adj[i].push_back(j);
adj[j].push_back(i);
}
int dist = bfs(n, adj);
cout << dist;
return 0;
}
//邻接矩阵
#include <bits/stdc++.h>
using namespace std;
const int N = 5001;
int bfs(int n, vector<vector<int>>& adj) {
int d[N];
memset(d, -1, sizeof(d)); //记录1到每个点的距离,-1表示未访问。
queue<int> q;
int start = 1;
d[start] = 0;
q.push(start);
while (!q.empty()) {
start = q.front();
q.pop();
for (int pos = 0; pos < N; pos ++) {
if (adj[start][pos] == 1 && d[pos] == -1) {
d[pos] = d[start] + 1;
if (pos == n) return d[pos];
q.push(pos);
}
}
}
return -1;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> adj;
adj.resize(N, vector<int>(N, 0));//邻接矩阵
for (int c = 0; c < m; c++) {
int i, j;
cin >> i >> j;
adj[i][j] = 1;
adj[j][i] = 1;
}
int dist = bfs(n, adj);
cout << dist;
return 0;
}

京公网安备 11010502036488号