国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

鄰接表和鄰接矩陣手寫簡潔代碼DFS BFS

2019-11-08 18:27:11
字體:
供稿:網(wǎng)友

鄰接表和鄰接矩陣手寫簡潔代碼DFS BFS

時間 2014-12-05 23:50:40 CSDN博客原文  http://blog.csdn.net/hhooong/article/details/41761621 主題 鄰接矩陣 鄰接表
這是通過鄰接矩陣進(jìn)行DFS
#include<iostream>#include<string> #include<windows.h>#define Max_ver_num 20using namespace std  ;bool visit[Max_ver_num] ;//這個數(shù)組的用途是標(biāo)記struct	HGraph{		string vexs [ Max_ver_num ] ; //放每個頂點(diǎn)的數(shù)組的名字		int arcs [Max_ver_num][Max_ver_num]  ; // ;鄰接矩陣		int vexnum ;	//頂點(diǎn)的數(shù)目		int arcnum ; //邊的數(shù)目,這邊的邊是沒有權(quán)值的		}; int Locate ( HGraph G , string  x ) { //確定頂點(diǎn)的位置		int k = 0;		while(G.vexs[k] != x) {			k++ ;		}		return k ;}void Create (HGraph &G){ //創(chuàng)建一個圖,這里的圖是指構(gòu)造無向圖,通過鄰接矩陣構(gòu)建	int i = 0 , j , k;	cout <<"輸入圖的頂點(diǎn)和邊的數(shù)目: ";	cin >>G.vexnum >>G.arcnum ;	cout <<"依次輸入各個頂點(diǎn)的名稱 :"; 	while (i<G.vexnum) {		cin >>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 <G.arcnum ; k++) {			cout <<"輸入鄰接頂點(diǎn) :" ; 			string v1 ,v2 ;			cin >> 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]  ; //因?yàn)槭菬o向圖,所以是互相~;	}			cout <<"done"<<endl;}void DFS(HGraph G , int j ) {		visit[j] = true ;		cout <<G.vexs[j] <<endl;		for(int k = 0 ;k <G.vexnum ; k++) {			if(!visit[k] && G.arcs[j][k]){					DFS(G,k) ;			}			}}void  DFS_tra(HGraph G ) {	for(int i = 0 ; i <G.vexnum ;i++) {		visit [i] = false ;//先把所有的點(diǎn)全都賦成falser ;}	for(int j = 0 ; j <G.vexnum ; j++){		if(!visit[j] ) {				DFS (G , j) ;		}			}}int main () {	HGraph G ;	Create (G) ;	cout <<"DFS 后的順序?yàn)?:"<<endl;	DFS_tra (G) ;	cout<< endl;	system ("pause" ) ;	return 0 ;}

通過鄰接表進(jìn)行BFS,我覺得寫得算簡單,雖然寫的很費(fèi)勁

#include<iostream>#include<string>#include<queue>#include<windows.h>using namespace std;#define Max 20  bool visit[20] ;//跟前面無向圖里面的作用一樣,后期用來判斷是否被訪問過 int Vex_Num; //看到網(wǎng)上都有這個,主要是用來判斷是否每個點(diǎn)都訪問過了   struct ArcNode{	int adjvex ; //弧所指的頂點(diǎn)位置  	ArcNode *nextarc ;// 指向next ->弧  } ;    typedef struct VNode{  	string data ;//頂點(diǎn)  	ArcNode *firarc ; //頂點(diǎn)出來的第一條狐  }AdjList [Max] ;    struct HGraph{  	AdjList vertices;//頭結(jié)點(diǎn)數(shù)組  	int vexnum;//頂點(diǎn)數(shù)  	int arcnum;//邊數(shù)  } ;    int Locate(HGraph G,string x){  //定位頂點(diǎn)位置 	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<<"請輸入頂點(diǎn)的數(shù)目和邊的數(shù)目:";  	cin>>G.vexnum>>G.arcnum;  	cout<<"請輸入頂點(diǎn)名稱:";  	for( i=0 ; i<G.vexnum ; i++){  		cin>>G.vertices[i].data;  		G.vertices[i].firarc=NULL;  	}     for(k=0;k<G.arcnum;k++){  		cout<<"end - begin順序輸入邊所對應(yīng)的兩個頂點(diǎn):" ;  		cin>>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 ;  	queue<int>q ;  	ArcNode *p ;  	for(i=0 ; i<G.vexnum ;i++){  		visit[i]=false ;//跟之前一樣,全部賦為false,表示未訪問  	}	for(i=0 ; i<G.vexnum ;i++){  		if(!visit[i]){  			visit[i]=true ;  			cout<<G.vertices[i].data<<"  " ;   Vex_Num+=1 ;  			if(G.vertices[i].firarc)  				 q.push(i) ; //進(jìn)站  				while( !q.empty() ){  					k=q.front();  					q.pop(); 					for(p=G.vertices[k].firarc;p;p=p->nextarc){  						w=p->adjvex;  						if(!visit[w]){  							visit[w]=true ;  							cout<<G.vertices[w].data<<"  ";   Vex_Num+=1;  							if(Vex_Num==G.vexnum)  								break;  //說明已經(jīng)全部訪問過							if(G.vertices[w].firarc)  									q.push(w);  					}  				}  			}  		}  	}  }//操他媽的覺得圖論好難int main  () {	HGraph G;	Create (G) ;	cout <<"經(jīng)過廣度優(yōu)先遍歷后輸出的順序?yàn)?:"<<endl; 	BFS_Tra (G) ;	system ("pause") ;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 迭部县| 长治县| 正安县| 健康| 深水埗区| 石景山区| 大悟县| 赣榆县| 武川县| 漳州市| 玉山县| 子洲县| 河东区| 南京市| 江门市| 济阳县| 西吉县| 永仁县| 章丘市| 搜索| 浦北县| 山阴县| 廉江市| 弥勒县| 汉沽区| 天津市| 达拉特旗| 潮州市| 会东县| 房山区| 阿坝| 油尖旺区| 长白| 岳池县| 通海县| 怀集县| 三门县| 吉木萨尔县| 岳阳市| 盐津县| 平昌县|