图的建立
图的组成:
顶点(Vertices)、边(Edges)
图的一些概念:
1.邻接(adjacent):v1和v2相连接
2.路径(path):一个顶点序列
3.圈(cycle):一个顶点出现了两次
图的表示:
1.邻接矩阵(空间大,但是速度快)
2.邻接表(空间小,但速度慢)
代码实现:
实现的是无权图
1.根据边的数目确定循环次数(一条边对应两个顶点)
2.用一个元素为vector的数据去组织数据,即每个顶点对应一个vector存放邻接顶点
3.每一次存放一条边对应的两个顶点
/**
*@name Build_Graph:建立一个无权无向图 手动输入或者从二维数组中读取
**/
void Build_Graph()
{
//手动输入图中的相邻节点
/*
int num;
int n,m;
cout<<"please input the edge num"<<endl;
cin>>num;
for(int i=0;i<num;i++)
{
cout<<"please input two Adjacent vertex"<<endl;
cin>>n>>m;
Graph[n].push_back(m);
Graph[m].push_back(n);
}*/
//从二维数组中读取
for(int i=0;i<12;i++)
{
Graph[vertex_couple[i][0]].push_back(vertex_couple[i][1]);
Graph[vertex_couple[i][1]].push_back(vertex_couple[i][0]);
}
}
BFS
广度优先遍历,搜索最短路径
算法描述:
1.给定起点和终点,从起点开始辐射;
2.利用队列去存放待辐射的顶点,首先应将起点推入队列;
3.从起点辐射到起点的所有邻接顶点,将起点推出队列(并标记已访问过),将所有邻接顶点(未访问过的)推入队列,并标记他们的上一顶点(为了最后的还原路径);
4.持续辐射,直到匹配到终点,然后利用之前标记的上一顶点,还原出最短路径;
代码实现:
/**
*@name BFS:广度搜索
*@param1 T:传入的邻接表
*@param2 s0:起始位置
*@param3 st:终止位置
**/
void BFS(vector<int> T[max_size],int s0,int st)
{
queue<int> Q;
int Know[10]={0};
int v;
int pre[10]={0}; //用来保存上一节点
Q.push(s0);
Know[s0]=1;
while(!Q.empty())
{
v=Q.front();
Q.pop();
for(int i=0;i<T[v].size();i++)
{
if(Know[T[v][i]]==0) //找到未访问过的节点
{
if(T[v][i]==st)
{
int temp=T[v][i];
vector<int> result;
pre[T[v][i]]=v;
//将路径还原
while(temp!=s0) //一直迭代到初始值,将结果存放在vector中
{
result.push_back(temp);
temp=pre[temp]; //从后往前还原路径
}
result.push_back(temp); //保存初始值
//输出最短路径
cout<<"the path is "<<endl;
vector<int>::iterator it; //定义一个迭代器 从后向前迭代
for(it=result.end()-1;it!=result.begin();it--)
{
cout<<*it<<" ";
}
cout<<*it<<endl; //输出目标位置
return;
}
else
{
Q.push(T[v][i]); //推入队列
Know[T[v][i]]=1; //标记为已访问过
pre[T[v][i]]=v; //保存上一节点
}
}
}
}
}
未完待续。。。