图在程序开发中是一个比较重要的数据结构,其基本的算法如:广度优先(BFS)、深度优先(DFS)是图算法的基本入门算法,现在总结如下:
<span style="font-size:14px;">
#include <iostream>
#include <queue>
#include <set>
using namespace std;
struct node_edge
{
int end_node_id; //终点结点的编号
int cost;//这条边的权值
node_edge * next;
};
struct node
{
char node_data;
node_edge *next;
};
class Graph
{
public:
//建图
node* Create_graph(int num) // 创建结点数为num个的图
{
this->node_num=num;
node* head=new node[num]; //在堆中创建num个结点数据
int i=1;
while(num--)
{
cout<<"请输入第"<<i<<"个结点的值:"<<endl;
cin>>head[i-1].node_data; //输入结点的值
head[i-1].next=NULL;//先把指针置空,防止指针乱指
int id=0;
int cost=0;
node_edge ** tem=&(head[i-1].next); //保存当前的尾节点
while(true)
{
cout<<"请输入第"<<i<<"个结点的下一个结点的编号:(-1退出)"<<endl; //注意是结点的编号,不是结点的值
cin>>id;
if(id==-1)
break;
cout<<"请输入该条路径的权值:"<<endl;
cin>>cost;
node_edge *edge=new node_edge;
edge->end_node_id=id;
edge->cost=cost;
edge->next=NULL;
*tem=edge;
tem=&edge->next;//tem 每次都指向最末尾的指针变量
}
i++;
}
graph_head=head;
return head;
}
//输出图
void print_graph()
{
node* tem=graph_head;
for(int i=0;i<node_num;i++) //这里如果对指针操作的话,可能无意改变了图的结构
{
cout<<tem[i].node_data<<"-->";
if(tem[i].next!=NULL)
{
node_edge edge=*(tem[i].next); //这里要对值操作
while(true)
{
cout<<edge.end_node_id<<","<<edge.cost<<"-->";
if(edge.next==NULL)
break;
edge=*(edge.next);
//tem[i].next=tem[i].next->next; //这里对指针操作,不小心改变了图的结构,错误!!!
}
}
cout<<"NULL"<<endl;
}
}
//广度优先搜索,非递归的方式
void BFS(int id)
{
if(id<=0&&id>node_num)
return;
queue<node> result;
bool *flag=new bool[node_num]; //标记当前结点是否已访问
memset(flag,false,node_num*sizeof(bool)); //初始化
result.push(graph_head[id-1]);
flag[id-1]=1;
node tem;
node_edge * edge;
while(!result.empty())
{
tem=result.front();
cout<<tem.node_data<<" ";
result.pop();
edge=tem.next;
while(edge!=NULL) //迭代
{
if(flag[edge->end_node_id-1]==0) //没有被访问
{
result.push(graph_head[edge->end_node_id-1]);
flag[edge->end_node_id-1]=1;
}
edge=edge->next;
}
}
cout<<endl;
}
//深度优先搜索,递归的方式
void recursion_DFS(int root)
{
if(root<=0||root>node_num)
return;
cout<<graph_head[root-1].node_data<<"-->";
had_found.insert(graph_head[root-1].node_data);
queue<node_edge> tem;
node_edge* now_edge=graph_head[root-1].next;
while(now_edge!=NULL)
{
tem.push(*now_edge);
now_edge=now_edge->next;
}
while(!tem.empty())
{
while(!tem.empty()&&had_found.find(graph_head[tem.front().end_node_id-1].node_data)!=had_found.end())
{
tem.pop();
}
if(!tem.empty())
{
int id=tem.front().end_node_id;
recursion_DFS(id);
}
}
}
private:
node* graph_head;
int node_num;
set<char> had_found;
};
int _tmain(int argc, _TCHAR* argv[])
{
Graph g;
//g.print_graph();
cout<<"请输入结点的个数:"<<endl;
int num;
cin>>num;
g.Create_graph(num);
g.print_graph();
g.BFS(1);
g.recursion_DFS(1);
//g.DFS(1);
return 0;
}</span>