邻接表与邻接矩阵空间复杂度直观差异
邻接表 空间复杂度 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; }