图的构造、DFS、BFS 以及图的删除实现
来源:互联网 发布:网络使人更亲近的例子 编辑:程序博客网 时间:2024/06/03 11:38
#include<iostream>#define maxsize 30#define NULLDATA -1/* 功能:邻接表存储图、DFS、BFS 以及 删除图*/using namespace std;typedef struct e_node *link;typedef struct e_node //邻接顶点{ int visit; //节点序号 link next; //下一个节点地址}e_node;typedef struct v_node // 顶点{ int info; link next_v; //边节点链表头部}v_node;typedef struct graph { v_node vertexs[maxsize]; int vexnum; int arcnum; int flag[maxsize];} graph;graph *G = (graph *)malloc(sizeof(graph));/*队列定义和函数部分 (BFS中用到队列)*/#define ElemType int //队列定义部分#define NUM_NULL -1#define maxsize_queue 20typedef struct Queue{ ElemType data[maxsize_queue]; int front,rear;}Queue;Queue *q;/* 图部分函数*/void Init() //初始化图{ for(int i = 0; i < maxsize; i++) { G->vertexs[i].info = NULLDATA;G->vertexs[i].next_v = NULL; } memset(G->flag,0,maxsize); cout<<"input the arcnum:"<<endl; //输入顶点个数和边数 cin>>G->arcnum;} void edge_add() //输入边来构造图 { int v1,v2; int k = 0; link ptr; do { do {cout<<"input the edge: "<<endl; cin>>v1; cin>>v2; }while(v1 >= maxsize || v2 >= maxsize); v1--;v2--; G->vertexs[v1].info = v1; G->vertexs[v2].info = v2; if(G->vertexs[v1].next_v == NULL) { cout<<"Hello"<<endl; G->vertexs[v1].info = v1; G->vertexs[v1].next_v = NULL; } if(G->vertexs[v1].next_v == NULL ) { G->vertexs[v1].next_v = (link)malloc(sizeof(e_node));G->vertexs[v1].next_v->visit = v2;G->vertexs[v1].next_v->next = NULL; } else { link p =(link)malloc(sizeof(e_node)); p->visit = v2;p->next = NULL;ptr = G->vertexs[v1].next_v; while(ptr->next != NULL) ptr = ptr->next; ptr->next = p; } k++; }while(k < G->arcnum ); if(k == G->arcnum) cout<<"The edge is full...."<<endl;}void delete_graph() //删除图{ link p1,p2; for(int i = 0; i < G->vexnum; i++) { p1 = p2 = G->vertexs[i].next_v;while(p1){ p2 = p1->next; delete p1; p1 = p2; cout<<i<<"is been done."<<endl;} }}void DFS(int v) //DFS实现{ link ptr; //DFS用头指针节点 G->flag[v] = 1; cout<<G->vertexs[v].info<<endl; ptr = G->vertexs[v].next_v; while(ptr != NULL) { if(G->flag[ptr->visit] == 0){ DFS(ptr->visit);}ptr = ptr->next; } return ;}/*队列部分函数*/void Init_queue(){ q=(Queue *)malloc(sizeof(Queue)); q->front=q->rear=0;}void in(ElemType v){ q->data[q->rear]=v; q->rear++;}ElemType out(){ ElemType tmp; tmp=q->data[q->front]; q->front++; return tmp;}bool empty_queue(){ return q->front == q->rear;}/*BFS实现部分*/void BSF(int v){link p; G->flag[v] = 1; in(v); while(!empty_queue()) { int k = out(); p = G->vertexs[k].next_v; cout<<G->vertexs[k].info<<endl;while(p){ int j = p->visit; if(G->flag[j] == 0) { G->flag[j] = 1;in(j); }p = p->next;} }}int main() { Init(); //初始化图 Init_queue(); //初始化队列 edge_add(); //输入边来构造图 cout<<"DFS:--------------"<<endl; //打印深搜 DFS(0); cout<<"BFS:------------------"<<endl; //打印广搜 memset(G->flag,0,maxsize); //对标识数组复位后才能重新使用BFS BSF(0); delete_graph(); //删除图 cout<<"over !"<<endl; system("pause"); return 0;}
只能在Dev C++ 下运行。
输入示例:(1,2)(1,4)(1,5)(2,3)(2,5)(4,6)(5,6)(6,7)(7,8)。
总结:
1、BFS中的队列未使用STL。
2、代码混乱。
3、对图算法认识需要跟多熟悉。
- 图的构造、DFS、BFS 以及图的删除实现
- 图的BFS、DFS算法实现
- 自己动手实现图的BFS和DFS
- 图的遍历算法实现DFS,BFS
- 图的dfs、bfs
- 图的基本操作及BFS与DFS的实现以及飞机换乘问题
- 图的邻接表建立以及DFS和BFS
- 图的遍历:DFS BFS
- 图的BFS与DFS
- 图的创建BFS DFS
- 图的dfs和bfs
- 图的遍历(DFS&BFS)
- 图的遍历[DFS][BFS]
- 图的建立 BFS DFS
- 图的BFS,DFS算法
- 图以及DFS和BFS
- 无向图的DFS和BFS算法实现
- 有向图的DFS和BFS算法实现
- mongodb 无法启动的时候
- div+css基础——2.网页宽度和居中设置
- CSS3——iPhone
- VB与API学习笔记(7)动画与特效
- Android学习:用户界面UI之AlertDialog
- 图的构造、DFS、BFS 以及图的删除实现
- 插入数据
- 用户模式异步过程调用(APC)
- 简单配置自己的Bash Shell
- QEMU-KVM Command Line学习笔记1
- SQLSERVER2008 18456错误
- euid和uid以及gcc的euid uid链接问题
- Cannot find bean: "EmpNumber" in any scope
- 【笔者支招】巧挪用户文件夹提高系统盘稳定性