way:队列,map(或set,只是我想用map)记录是否访问过,没访问过的邻接的都放入,放入时记录已访问过,pop出时打印。
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
using namespace std;
class Node;
//边结构的描述
class Edge
{
public:
//边的起始节点
Node *from;
//边的终点节点
Node *to;
//边的权重
int weight;
public:
Edge(Node *from, Node *to, int weight)
{
this->from = from;
this->to = to;
this->weight = weight;
}
};
//点结构的描述
class Node
{
public:
//编号值
int value;
//入度
int in;
//出度
int out;
//邻接的点
vector<Node*> nexts;
//邻接的边
vector<Edge*> edges;
public:
Node()
{
}
Node(int value)
{
this->value = value;
in = 0;
out = 0;
}
};
//图结构的描述
class Graph
{
public:
map<int, Node*> nodes;
set<Edge*> edges;
Graph()
{
}
};
//利用边结构描述的图来构建图结构
//[0,7,5] [from,to,weight]
//[0,1,3] [from,to,weight]
Graph* createGraph(vector<vector<int>> matrix)
{
Graph *graph = new Graph();
int m = matrix.size();
for(int i=0; i<m; i++)
{
int from = matrix[i][0];
int to = matrix[i][1];
int weight = matrix[i][2];
//将起点结构放到图里面
if(!graph->nodes.count(from))
{
Node *fromNode =new Node(from);
graph->nodes[from] = fromNode;
}
//将终点结构放到图里面
if(!graph->nodes.count(to))
{
Node *toNode=new Node(to);
graph->nodes[to] = toNode;
}
//将起点和终点的边结构也放到图里面(点可能已经存在过,边一定是新的)
Node *fromNode = graph->nodes[from];
Node *toNode = graph->nodes[to];
Edge *newEdge = new Edge(fromNode, toNode, weight);
fromNode->nexts.push_back(toNode);
fromNode->edges.push_back(newEdge);
fromNode->out++;
toNode->in++;
graph->edges.insert(newEdge);
}
return graph;
}
void bfs(Node *start)
{
//start节点必须存在
queue<Node*>que;
map<Node*,bool>vis;
que.push(start);
vis[start]=true;
while(que.size()>0)
{
Node* cur = que.front();
cout<<cur->value<<" ";
que.pop();
for(auto next: cur->nexts)
{
if(vis.count(next)==0)
{
que.push(next);
vis[next]=true;
}
}
}
cout<<endl;
}