圖的鄰接矩陣
阿新 • • 發佈:2020-12-13
#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);
}