#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 构建邻接表
class DenseGraph{
private:
int n, m; // 顶点数,边数
vector<vector<int> > neighbor;
vector<int> visited;
int ccount;
int *id;
int *from; // 记录某个节点来自哪个节点
public:
DenseGraph(int n)
{
this->n = n;
this->m = 0;
neighbor.resize(n);
visited.resize(n);
id = new int[n];
from = new int[n];
for(int i = 0; i < n; i++)
{
id[i] = -1;
neighbor.push_back(vector<int>());
visited[i] = false;
from[i] = -1;
}
}
// 求两点间的路径
void path(int w, vector<int> &vec)
{
stack<int> s;
int p = w;
while(p != -1)
{
s.push(p);
p = from[p];
}
while( !s.empty() )
{
vec.push_back(s.top());
s.pop();
}
}
// 打印路径
void showPath(int v, int w)
{
dfs(v);
vector<int> vec;
path(w, vec);
for(int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << endl;
}
// 检测两点之间是否存在边
bool hasEdge(int v, int w)
{
for(int i = 0; i < neighbor[v].size(); i++)
{
if(neighbor[v][i] == w)
return true;
}
return false;
}
//构造邻接表
void addEdge(int v, int w)
{
if(hasEdge(v, w))
return;
neighbor[v].push_back(w);
neighbor[w].push_back(v);
m++;
}
// 深度优先遍历
void dfs(int v)
{
id[v] = ccount;
visited[v] = 1;
for(auto it : neighbor[v])
{
if(!visited[it])
{
from[it] = v;
dfs(it);
}
}
}
// 遍历全部节点,有可能图是不连通的
void dfsall()
{
for(int i = 0; i < n; i++)
{
if(!visited[i])
{
dfs(i);
ccount;
}
}
}
void show()
{
for(int i = 0; i < n; i++)
{
cout << i << ":";
for(int j : neighbor[i])
cout << j << " ";
cout << endl;
}
}
bool isConnected(int v, int w)
{
return id[v] == id[w];
}
~DenseGraph()
{
delete id;
}
};
int main()
{
int n, m;
cin >> n>> m;
DenseGraph g(n);
for(int i = 0; i < m; i++)
{
int v, w;
cin >> v >> w;
g.addEdge(v, w);
}
g.show();
/*for(int i = 0; i < 3; i++)
{
int v, w;
cin >> v >> w;
cout << g.isConnected(v, w) <<endl;
}*/
g.showPath(0, 4);
return 0;
}
每日一练之邻接表的实现
最新推荐文章于 2023-01-06 12:44:35 发布