图的遍历算法程序

来源:互联网 发布:js div添加内容 编辑:程序博客网 时间:2024/04/26 20:13

这个程序是关于图的遍历算法的    编程风格有点不美观   来自于http://wenku.baidu.com/view/8f5ad239376baf1ffc4fad92.html

#include<iostream>#define INFINITY 32767#define MAX_VEX 20//最大顶点数#define QUEUE_SIZE (MAX_VEX+1) //队列长度using namespace std;bool * visited;//访问标志数组//图的邻接矩阵存储结构typedef struct{char * vexs;//顶点向量int arcs[MAX_VEX][MAX_VEX];//邻接矩阵int vexnum,arcnum;//图的当前顶点数和弧数}Graph;//队列类class Queue//循环队列(数组){public:void InitQueue(){base=new int[QUEUE_SIZE];front=rear=0;}void EnQueue(int e){base[rear]=e;rear=(rear+1)%QUEUE_SIZE;}void DeQueue(int & e){e=base[front];front=(front+1)%QUEUE_SIZE;}public:int * base;int front;int rear;};//图G中查找元素c的位置int Locate(Graph G,char c){for(int i=0;i<G.vexnum;i++)if(G.vexs[i]==c)return i;return -1;}//创建无向网void CreateUDN(Graph & G){int i,j,w,s1,s2;char a,b,temp;printf("输入顶点数和弧数:");scanf("%d%d",&G.vexnum,&G.arcnum);temp=getchar();//接收回车G.vexs=new char;printf("输入%d个顶点.\n",G.vexnum);for(i=0;i<G.vexnum;i++)//初始化顶点{printf("输入顶点%d:",i);scanf("%c",&G.vexs[i]);temp=getchar();}for(i=0;i<G.vexnum;i++)//初始化邻接矩阵for(j=0;j<G.vexnum;j++)G.arcs[i][j]=INFINITY;printf("输入%d条弧.\n",G.arcnum);for(i=0;i<G.arcnum;i++)//初始化弧{printf("输入弧%d:",i);scanf("%c %c %d",&a,&b,&w);//输入一条边依附的顶点和权值temp=getchar();s1=Locate(G,a);s2=Locate(G,b);G.arcs[s1][s2]=G.arcs[s2][s1]=w;}}//图G中顶点k的第一个邻接点int FirstVex(Graph G,int k){if(k>=0 && k<G.vexnum){for(int i=0;i<G.vexnum;i++)if(G.arcs[k][i]!=INFINITY)return i;}return -1;}//图G中顶点i的第j个邻接顶点的下一个邻接顶点int NextVex(Graph G,int i,int j){if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum){for(int k=j+1;k<G.vexnum;k++)if(G.arcs[i][k]!=INFINITY)return k;}return -1;}//深度优先遍历void DFS(Graph G,int k){int i;if(k==-1)//第一次执行DFS时,k为-1{for(i=0;i<G.vexnum;i++)if(!visited[i])DFS(G,i);//对未访问的顶点调用DFS}else{visited[k]=true;printf("%c",G.vexs[k]);//访问第k个顶点for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))if(!visited[i])DFS(G,i);//对k的尚未访问的邻接点i递归调用DFS}}//广度优先搜索void BFS(Graph G){int k,i=0;Queue Q;Q.InitQueue();if(!visited[i])//i尚未访问{visited[i]=true;printf("%c",G.vexs[i]);Q.EnQueue(i);//i入队while(Q.front!=Q.rear)//如果队列不空{Q.DeQueue(k);for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))if(!visited[w]){visited[w]=true;printf("%c",G.vexs[w]);Q.EnQueue(w);}}}}//主函数int main(){int i;Graph G;CreateUDN(G);visited=(bool*)malloc(G.vexnum*sizeof(bool));printf("\n深度优先遍历:");for(i=0;i<G.vexnum;i++)visited[i]=false;DFS(G,-1);printf("\n广度优先遍历:");for(i=0;i<G.vexnum;i++)visited[i]=false;BFS(G);printf("\n程序结束.\n");}
原创粉丝点击