频道栏目
首页 > 资讯 > Java > 正文

邻接表和邻接矩阵手写简洁代码DFS BFS

14-12-06        来源:[db:作者]  
收藏   我要投稿
这是通过邻接矩阵进行DFS
#include
#include 
#include
#define Max_ver_num 20
using namespace std  ;
bool visit[Max_ver_num] ;//这个数组的用途是标记
struct	HGraph{
		string vexs [ Max_ver_num ] ; //放每个顶点的数组的名字
		int arcs [Max_ver_num][Max_ver_num]  ; // ;邻接矩阵
		int vexnum ;	//顶点的数目
		int arcnum ; //边的数目,这边的边是没有权值的
		
}; 

int Locate ( HGraph G , string  x ) { //确定顶点的位置
		int k = 0;
		while(G.vexs[k] != x) {
			k++ ;
		}
		return k ;
}

void Create (HGraph &G){ //创建一个图,这里的图是指构造无向图,通过邻接矩阵构建
	int i = 0 , j , k;
	cout <<"输入图的顶点和边的数目: ";
	cin >>G.vexnum >>G.arcnum ;
	cout <<"依次输入各个顶点的名称 :"; 
	while (i>G.vexs[i++] ;
	}

	for(i = 0 ; i < G.vexnum;i++){
		for(j = 0 ; j < G.vexnum; j ++) {
			G.arcs[i][j] = 0 ;
		}
	}
	for( k=0 ;k > v1 >>v2		;
			i = Locate (G , v1) ;
			j = Locate (G , v2) ;
			while (i<0 || j<0){
				cout <<"输入有误,请重输 :  " ; 
				cin >>v1 >> v2 ;
				i = Locate (G , v1) ;
				j = Locate (G , v2) ;
			}
			G.arcs [i][j]  = 1 ;
			G.arcs[j][i] =G.arcs[i][j]  ; //因为是无向图,所以是互相~;
	}
			cout <<"done"<

 

通过邻接表进行BFS,我觉得写得算简单,虽然写的很费劲

 

#include
#include
#include
#include
using namespace std;
#define Max 20  
bool visit[20] ;//跟前面无向图里面的作用一样,后期用来判断是否被访问过 
int Vex_Num; //看到网上都有这个,主要是用来判断是否每个点都访问过了
   
struct ArcNode{
    int adjvex ; //弧所指的顶点位置  
    ArcNode *nextarc ;// 指向next ->弧  
} ;  
  
typedef struct VNode{  
    string data ;//顶点  
    ArcNode *firarc ; //顶点出来的第一条狐  
}AdjList [Max] ;  
  
struct HGraph{  
    AdjList vertices;//头结点数组  
    int vexnum;//顶点数  
    int arcnum;//边数  
} ;  
  
int Locate(HGraph G,string x){  //定位顶点位置 
	int v ;
	for(v=0;G.vertices[v].data!=x ;v++){
					//donothing
	};  
    return v;  
}  
  
  
void Create(HGraph &G) {    
    string v1,v2;  
    int i , j , k ;  
    cout<<"请输入顶点的数目和边的数目:";  
    cin>>G.vexnum>>G.arcnum;  
    cout<<"请输入顶点名称:";  
    for( i=0 ; i>G.vertices[i].data;  
        G.vertices[i].firarc=NULL;  
    }  
   for(k=0;k>v1>>v2 ;   
        i = Locate(G,v1) ;  
        j = Locate(G,v2) ;  
        while(i<0|| j<0){  
            cout<<"有误,请重新输入: ";  
            cin>>v1>>v2;  
            i=Locate(G,v1);  
            j=Locate(G,v2);   
        }  
		ArcNode *p=new ArcNode;  
        p->adjvex = j ;  
        p->nextarc = G.vertices[i].firarc ;  
        G.vertices[i].firarc = p ;  
    }  
}  
void BFS_Tra(HGraph G){  
    Vex_Num = 0 ;  
    int i , k , w ;  
    queueq ;  
    ArcNode *p ;  
	for(i=0 ; inextarc){  
						w=p->adjvex;  
						if(!visit[w]){  
							visit[w]=true ;  
							cout<
相关TAG标签
上一篇:Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现
下一篇:[BZOJ 1072][SCOI 2007]排列perm
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站