图的表达方式非常的多,要找到一种自己熟练的表达方式非常重要,这里就介绍一下左神的推荐
在写图之前先简单了解一下在本文章中set集合,栈和队列的使用方法
Set集合
set<int> a;
a.begin()--返回迭代器(可以先理解为指针)指向的第一个元素
a.empty()--判断集合是否为空,如果为空返回true
a.find()--寻找到一个元素
a.end()--返回迭代器指向最后一个元素
a.count()--返回某个值在集合中出现的次数
a.insert(x)--插入元素x
Stack栈
stack<int> b;
b.empty()--如果栈为空返回true
b.size()--返回栈中的元素个数
b.pop()--删除栈顶的元素但不返回其值
b.top()--返回栈顶的元素但不返回其值
b.push()--在栈顶压入新的元素
Queue队列
queue<int> c;
c.size()--返回队列中的元素个数
c.pop()--删除队列首元素但不返回其值
c.front()--返回队列首元素的值但不删除该元素
c.push()--在队尾压入新元素
c.back()--返回队列尾元素的值,但不删除该元素
废话不多说,直接上码!
首先是头文件和类的建立
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
using namespace std;
class Edge ;
class Node //点的类
{
public:
int value;
int in;
int out;
vector<Node*>nodes;
vector<Edge*>edges;
Node(int value)
{this->value=value;
in=0;
out=0;
}
};
class Edge //边的类
{public:
int weight;
Node* from;
Node* to;
Edge(int Weight,Node* From,Node* To)
{weight=Weight;
from=From;
to=To;
}
};
class Graph //图的类
{public:
map<int,Node*> nodes;
set<Edge*> edges;
};
这个函数很重要,相当于一个接口,可以将一个图通过你自己的方式放入自己建立的类中
Graph* setin(int matrix[][3],int n) //matrix[][0]为起始点,matrix[][1]为终点,matrix[][2]为边长,n为边数
{Graph* graph=new Graph;
for (int i=0;i<n;i++)
{ int from=matrix[i][0];
int to=matrix[i][1];
int weight=matrix[i][2];
if (graph->nodes.find(from)==graph->nodes.end())
{ graph->nodes[from]=new Node(from);
}
if (graph->nodes.find(to)==graph->nodes.end())
{ graph->nodes[to]=new Node(to);
}
Node* fromnode=graph->nodes[from];
Node* tonode=graph->nodes[to];
Edge* newedge=new Edge(weight,fromnode,tonode);
fromnode->nodes.push_back(tonode);
fromnode->out++;
fromnode->edges.push_back(newedge);
tonode->in++;
graph->edges.insert(newedge);
}
return graph;
}
然后是BFS(宽度优先遍历)
void BFS(Node* node) //图的宽度优先遍历
{ if (node==NULL)
{ return;
}
set<Node*> nodeset;
queue<Node*> nodeque;
nodeset.insert(node);
nodeque.push(node);
while(!nodeque.empty())
{ Node* cur=nodeque.front();
nodeque.pop();
cout<<"此点的值为:"<<cur->value<<endl;
Node* next;
for(int i=0;i<cur->nodes.size();i++)
{ next=cur->nodes[i];
if (nodeset.find(next)==nodeset.end())
{ nodeque.push(next);
nodeset.insert(next);
}
}
}
}
DFS(深度优先遍历)
void DFS(Node* node) //深度优先遍历
{if (node==NULL)
return;
stack<Node*> nodestack;
set<Node*> nodeset2;
nodeset2.insert(node);
nodestack.push(node);
cout<<"该点的值为:"<<node->value<<endl;
while (!nodestack.empty())
{
Node* cur=nodestack.top();
nodestack.pop();
for (int i=0;i<cur->nodes.size();i++)
{ Node* next=cur->nodes[i];
if (nodeset2.find(next)==nodeset2.end())
{
nodestack.push(cur);
nodestack.push(next);
nodeset2.insert(next);
cout<<"这个点的值为:"<<next->value<<endl;
break;
}
}
}
}
欢迎指导!