1. 程式人生 > 其它 >圖的鄰接矩陣

圖的鄰接矩陣

技術標籤:演算法學習資料結構資料結構

#include<bits/stdc++.h>  //鄰接矩陣 
const int MAX1=20; //頂點最大值 
const int MAX2=101;  //矩陣最大階數
const int MAX3=101; //佇列最大容量 
using namespace std; 
typedef char typelem;
typedef int Edgetype;  
typedef struct{
	typelem G_node[MAX1];//結點 
	int n,e;//n為結點數,e為邊數 
	Edgetype edge[MAX2][MAX2];//鄰接矩陣 
int Typegraph;//圖的型別,1為有向圖,2為無向圖 }G_raph; //佇列 typedef struct{ int data[MAX2]; int top; int rear; }listqueue; int enqueue(listqueue *p,int e)//入列 { p->data[p->rear]=e; p->rear=(p->rear+1)%MAX3; return 0; } int outqueue(listqueue *p,int &i){ i=p->data[p->top]; p->top=
(p->top+1)%MAX3; return 0; } //圖的建立 void Graphcreate(G_raph *G) { int i,j,t; cout<<"輸入圖的型別(1為有向圖,2為無向圖):";cin>>G->Typegraph; cout<<"輸入結點數:";cin>>G->n; cout<<"輸入邊數:";cin>>G->e; cout<<"結點賦值:";G->G_node[
0]=0; for(i=1;i<=G->n;i++){ cin>>G->G_node[i]; } cout<<"矩陣(輸入n條邊,一共n行,\"i j\"表示第i行第j列):\n"; for(i=0;i<=G->n;i++){ for(j=0;j<=G->n;j++){ G->edge[i][j]=0; } } if(G->Typegraph==2) for(t=0;t<G->e;t++){ cin>>i>>j; G->edge[i][j]=1; G->edge[j][i]=1; } else for(t=0;t<G->e;t++){ cin>>i>>j; G->edge[i][j]=1; } } //列印圖的資訊 void print(const G_raph &G){ int i,j; cout<<"結點資訊:"; for(i=1;i<=G.n;i++) cout<<G.G_node[i]; cout<<"\n邊資訊:"; for(i=1;i<=G.n;i++) for(j=1;j<=G.n;j++) if(G.edge[i][j]){ if(G.Typegraph==1) printf("<%c,%c> ",G.G_node[i],G.G_node[j]); else printf("(%c,%c) ",G.G_node[i],G.G_node[j]); } cout<<'\n'; } //深度優先遍歷,起始點地址為t void Findgraph(const G_raph *G,int t,int *le) { cout<<G->G_node[t]; le[t]=1; for(int i=1;i<=G->n;i++){ if(G->edge[t][i]==1&&le[i]==0) Findgraph(G,i,le); } return; } //廣度優先遍歷,i為初始訪問的地址 void Find_graph(const G_raph *G,int t,int *le) { int i,j; listqueue *p=new listqueue;p->rear=p->top=0;//佇列初始化 cout<<G->G_node[t]; le[t]=1;//訪問結點 enqueue(p,t);//入列 while(p->rear!=p->top){ outqueue(p,t); for(i=1;i<=G->n;i++) { if(G->edge[t][i]==1&&le[i]==0) { cout<<G->G_node[i];le[i]=1;//訪問結點 enqueue(p,i);//入列 } } } } int main() { G_raph G; Graphcreate(&G); print(G); int le[G.n+1]={0}; cout<<"遍歷結果:"; Find_graph(&G,1,le); }