最近在复习图论,主要是为了看一下深搜广搜算法。下面的例子中包含了基本的图的操作,以及深搜广搜算法,仅供记录。
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
#define MaxInt 32767
#define MvNum 100
bool visited[MvNum]={false};
//无向图
//图的数据结构
typedef struct {
char vexs[MvNum]; //顶点表
int arcs[MvNum][MvNum]; //邻接矩阵
int vexnum , arcsnum; //图的当前点数和边数
}Graph;
//初始化函数,初始化图的顶点表邻接矩阵
void InitGraph(Graph &G){
memset(G.vexs,'#',sizeof(G.vexs));
memset(G.arcs,0,sizeof(G.arcs));
G.arcsnum=0;
G.vexnum=0;
}
//打印图的顶点表
void printVexs(Graph &G){
for(int i=0;i<G.vexnum;i++){
cout<<G.vexs[i]<<" ";
}
cout<<endl;
cout<<endl;
}
//打印图的邻接矩阵
void printArcs(Graph &G){
for(int i=0;i<G.vexnum;i++){
cout<<G.vexs[i]<<" ";
for (int j=0;j<G.vexnum;j++){
cout<<G.arcs[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<endl;
}
//插入新顶点函数
bool InsertNode(Graph &G,char a){
if(G.vexnum<MvNum){
G.vexs[G.vexnum++]=a;
cout<<"ok"<<endl;
return true;
}else {
cout<<"the request has been refused because the vexs is full"<<endl;
return false;
}
}
//插入新边 函数
bool InsertArcs(Graph &G,char a,char b){
int flag1,flag2;
flag1=-1;
flag2=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a)flag1=i;
if(G.vexs[i]==b)flag2=i;
}
if(flag1!=-1&&flag2!=-1){
G.arcs[flag1][flag2]=G.arcs[flag2][flag1]=1;
G.arcsnum++;
cout<<"ok"<<endl;
return true;
}else{
cout<<"dont find the node";
return false;
}
}
//判断是否存在边(a,b)
bool isExistEdage(Graph &G,char a,char b){
int flag1,flag2;
flag1=-1;
flag2=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a)flag1=i;
if(G.vexs[i]==b)flag2=i;
}
if(flag1!=-1&&flag2!=-1&&G.arcs[flag1][flag2]==1&&G.arcs[flag2][flag1]==1){
return true;
}
return false;
}
//创建图
void CreateGroup(Graph &G){
char flag1,flag2;
int n,m;
cout<<"请输入顶点数目:"<<endl;
cin>>n;
cout<<"请输入边的数目:"<<endl;
cin>>m;
cout<<"请输入所有顶点的数据:"<<endl;
for(int i=0;i<n;i++){
cin>>flag1;
if(InsertNode(G,flag1))continue;
else break;
}
cout<<"请输入所有边(每行输入连接的两个顶点):"<<endl;
for(int i=0;i<m;i++){
cin>>flag1>>flag2;
if(InsertArcs(G,flag1,flag2))continue;
else break;
}
printVexs(G);
printArcs(G);
}
//删除图的一条弧
void DeleteArcs(Graph &G,char a ,char b){
int flag1,flag2;
flag1=-1;
flag2=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a)flag1=i;
if(G.vexs[i]==b)flag2=i;
}
if(flag1!=-1&&flag2!=-1&&G.arcs[flag1][flag2]==1&&G.arcs[flag2][flag1]==1){
G.arcs[flag1][flag2]=0;
G.arcs[flag2][flag1]=0;
}else{
cout<<"出现错误"<<endl;
}
}
//打印某个节点的邻接节点
void FirstAdjVex(Graph &G,char a){
int flag;
char sum;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a){
flag=i;
break;
}
}
for(int i=0;i<G.vexnum;i++){
if(G.arcs[i][flag]==1){
sum=G.vexs[i];
cout<<sum<<" ";
}
}
cout<<endl;
}
//删除图中某个节点及其连接的弧
bool DeleteVex(Graph &G,char a){
int flag=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a){
flag=i;
break;
}
}
if(flag==-1)return false;
else{
int sum=flag;
while(flag<G.vexnum-1){
G.vexs[flag]=G.vexs[flag+1];
for(int i=0;i<G.vexnum;i++){
if(G.arcs[i][flag]==1)G.arcsnum-=2;
G.arcs[i][flag]=G.arcs[i][flag+1];
}
flag++;
}
while(sum<G.vexnum-1){
for(int i=0;i<G.vexnum;i++){
G.arcs[sum][i]=G.arcs[sum+1][i];
}
sum++;
}
G.vexnum--;
}
}
//深搜遍历函数
void DFS(Graph &G,char a){
//访问标记数组
int flag=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a){
flag=i;
break;
}
}
if(flag!=-1){
cout<<G.vexs[flag];
visited[flag]=true;
for(int j=0;j<G.vexnum;j++){
if(G.arcs[flag][j]==1&&!visited[j]){
cout<<"->";
DFS(G,G.vexs[j]);
}
}
}
}
//广度搜索遍历函数
void BFS(Graph &G,char a){
queue<char> Q;
//访问标记数组
int flag=-1;
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==a){
flag=i;
break;
}
}
if(flag!=-1){
cout<<G.vexs[flag];
visited[flag]=true;
Q.push(flag);
while(!Q.empty()){
char v=Q.front();
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==v){
flag=i;
break;
}
}
Q.pop();
for(int j=0;j<G.vexnum;j++){
if(G.arcs[flag][j]==1&&!visited[j]){
cout<<"->";
cout<<G.vexs[j];
visited[j]=true;
Q.push(G.vexs[j]);
}
}
}
cout<<endl;
}
}
int main(){
Graph G;
InitGraph(G);
CreateGroup(G);
char a='A';
// FirstAdjVex(G,a);
// DeleteVex(G,a);
// printVexs(G);
// printArcs(G);
// DFS(G,a);
BFS(G,a);
return 0;
}
//测试用例
/*
6 8 ABCDEF
A B
A C
B C
B D
C D
C E
D F
E F
*/