C++创建图结构,深度广度遍历图
首先邻接矩阵表示,MGrapgh是指向图结点的指针
struct GNode{
int Nv;
int Ne;
vector<vector<int>> arr;
};
struct ENode{
int v1,v2;
int weight=1;
};
class graphSolution {
public:
//访问记录
vector<bool> visited;
//插入边
void insertEdge(GNode* G, ENode* E) {
G->arr[E->v1][E->v2] = E->weight;
G->arr[E->v2][E->v1] = E->weight;
}
//创建无边图
GNode* creatGraph(int Nv) {
int v,w; //顶点
GNode* MGraph = new GNode;
MGraph->Nv = Nv;
MGraph->Ne = 0;
MGraph->arr.assign(Nv,vector<int>(Nv));
for(v=0;v<Nv;v++) {
for(w=0;w<Nv;w++) {
MGraph->arr[v][w]=0;
}
}
return MGraph;
}
//建立完整图
//由键盘输入数据
GNode* buildGraph() {
GNode* MGraph = new GNode;
ENode* Edge = new ENode;
int Nv,i;
cout<<"input --Nv: ";
cin>>Nv;
MGraph = creatGraph(Nv);
cout<<"input Ne: ";
cin>>MGraph->Ne;
if(MGraph->Ne != 0) {
for(i=0;i<MGraph->Ne;i++) {
cout<<"input two dd: ";
cin>>Edge->v1>>Edge->v2;
insertEdge(MGraph,Edge);
}
}
return MGraph;
}
//DFS搜索图
void DFSGraph(GNode* MGraph,int i) {
int j;
cout<<i<<"--";
visited[i] = true;
for(j=0;j<MGraph->Nv;j++){
if(MGraph->arr[i][j]==1 && !visited[j]) {DFSGraph(MGraph,j);}
}
}
//BFS搜索图
void BFSGraph(GNode* MGraph) {
queue<int> q;
q.push(0); //从顶点0开始遍历
int tmp;
while(!q.empty()) {
tmp = q.front();q.pop();
cout<<tmp<<"--";
visited[tmp]=true;
for(int i=0;i<MGraph->Nv;i++) {
if(MGraph->arr[tmp][i]==1 && !visited[i]) {q.push(i);}
}
}
}
};
int main() {
GNode* MGraph;
graphSolution s;
MGraph = s.buildGraph();
//遍历之前要初始化一下visited
s.visited.assign(MGraph->Nv, false);
s.DFSGraph(MGraph, 0); //从顶点0开始遍历
s.visited.assign(MGraph->Nv, false);
s.BFSGraph(MGraph);
return 0;
}
邻接表表示图结构,LGraph是指向图结点的指针
/*邻接表来表示图
*G[N]为指针数组,数组元素每一指针对应矩阵每行一个链表,只存非0元素
*/
//列表结点
struct LinkNode {
int v; //顶点下标
int weight=1; //边权重
LinkNode* next;
};
//图结点
struct GNode { //图结点
int Nv,Ne;
vector<LinkNode*> arr;
};
class graphSolution {
public:
vector<bool> visited;
//建立图(建立无边图 + 填入数据 )
GNode* buildGraph() {
GNode* LGraph;
LinkNode *p1, *p2;
LGraph = new GNode;
int Nv,Ne;
cout<<"input Nv: ";
cin>>Nv;
cout<<"input Ne: ";
cin>>Ne;
LGraph->Nv = Nv;
LGraph->Ne = Ne;
LGraph->arr.assign(Nv,NULL);
for(int i=0;i<Ne;i++) {
p1 = new LinkNode;
p2 = new LinkNode;
cout<<"input two dd: ";
cin>>p1->v;
cin>>p2->v;
//创建无向图
p2->next = LGraph->arr[p1->v];
LGraph->arr[p1->v] = p2;
p1->next = LGraph->arr[p2->v];
LGraph->arr[p2->v] = p1;
}
return LGraph;
}
//展示邻接表的内容
void showLGraph(GNode* LGraph) {
LinkNode* P;
for(int i=0;i<LGraph->Nv;i++) {
p = LGraph->arr[i];
cout<<i<<"--";
while(p!=NULL) {
cout<<p->v<<"--";
p = p->next;
}
cout<<endl;
}
}
//DFS遍历邻接表图
void DFSLGraph(GNode* LGraph, int i) {
LinkNode* p;
p = LGraph->arr[i];
while(p!=NULL) {
if(visited[p->v]==false) {
cout<<p->v<<"--";
visited[p->v]=true;
DFSLGraph(LGraph,p->v);
}
p = p->next;
}
}
//BFS遍历邻接表图
void BFSLGraph(GNode* LGraph) {
queue<LinkNode*> q;
LinkNode *p,*p2;
p=LGraph->arr[0]; //先输出0顶点
cout<<0<<"--";
visited[0]=true;
while(p!=NULL) { //填充队列
q.push(p);
p=p->next;
}
while(!q.empty()) {
p=q.front();q.pop();
cout<<p->v<<"--";
visited[p->v]=true;
p2=LGraph->arr[p->v];
while(p2!=NULL) {
if(visited[p2->v]==false) {q.push(p2);}
p2=p2->next;
}
}
}
};
int main() {
// cout<<"start28"<<endl;
GNode* LGraph;
graphSolution s;
LGraph = s.buildGraph();
s.showLGraph(LGraph);
s.visited.assign(LGraph->Nv, false);
s.DFSLGraph(LGraph, 0);
cout<<endl;
s.visited.assign(LGraph->Nv, false);
s.BFSLGraph(LGraph);
cout<<endl<<"success";
return 0;
}