图图
图的结构定义(邻接表)图的结构定义(邻接表)
struct Edge;
struct Node
{
int id;//节点id,如果节点本身有值还可以加val字段。
bool visit;//是否访问
vector<shared_ptr> nexts;//从本节点出发的下一个节点,有向无向均可。
vector<shared_ptr> edges;
Node(int _id) :id(_id), visit(false) {}
};
typedef shared_ptr NodePtr;//因为容器里要放指针,所以定义指针格式
struct Edge
{
NodePtr from;//起始节点id
NodePtr to;
int w;//权重
Edge(int _from, int _to, int _w) :from(_from), to(_to), w(_w) {}
};
typedef shared_ptr EdgePtr;
//初始化
void init()
{
vector<vector> arr = { {1,2,6},{1,3,1},{1,4,5},{2,3,5},{2,5,3},
{3,4,5},{3,6,4},{3,5,6},{4,6,2}, {5,6,6} };
unordered_map nodes;
vector edges;
for (int i = 0; i < arr.size(); i++)
{
int fromid = arr[i][0], toid = arr[i][1], w = arr[i][2];
//初始化节点
if (nodes.find(fromid) == nodes.end())
nodes[fromid] = make_shared(fromid);
if (nodes.find(toid) == nodes.end())
nodes[toid] = make_shared(toid);
nodes[fromid]->nexts.push_back(nodes[toid]);
nodes[toid]->nexts.push_back(nodes[fromid]);
//in在拓扑排序起作用,所以认为有向图处理,其他处理都是无向图。
nodes[toid]->in += 1;
//初始化边
EdgePtr edge = make_shared(nodes[fromid], nodes[toid], w);
edges.push_back(edge);
nodes[fromid]->edges.push_back(edge);
nodes[toid]->edges.push_back(edge);
}
}
bfs,,dfs遍历遍历
void bfs(const NodePtr& root)
{//按照二叉树的bfs写,只不过图是多插
queue qu;
root->visit = true;
qu.push(root);
while (!qu.empty())
{
NodePtr n = qu.front();
qu.pop();
cout <id <nexts)
{
if (t->visit == false)
{
t->visit = true;
qu.push(t);
}
}
}
}
void dfs(const NodePtr& root)
{//按照二叉树的前序遍历写,非递归时 弹根->添右左节点,
stack st;