邻接矩阵,构造有向图、无向图、有向网、无向网,深度优先、广度优先遍历(C++图)

#include <iostream>
using namespace std;
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20//最大顶点个数 
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct{
	string vexs[MAX_VERTEX_NUM];//顶点向量 
	int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵.对无权图,用1或0表示相邻否;对带权图,则为权值类型
	int vexnum,arcnum;//图的当前顶点数和弧数 
	GraphKind kind;//图的种类标志 
}MGraph;
int LocateVex(MGraph G,string v)
{
	int i;
	for(i=0;i<G.vexnum;i++)
	{
		if(G.vexs[i]==v)break;
	}
	return i;
}
void Create(MGraph &G)
{
	int i;
	cout<<"图的顶点数:";
	cin>>G.vexnum;
	cout<<"图的弧数:";
	cin>>G.arcnum;
	cout<<"图的当前顶点名:";
	for(i=0;i<G.vexnum;i++)cin>>G.vexs[i];//构造顶点向量 	
}
void CreateDG(MGraph &G)
{
	int i,j,k;
	string v1,v2; 
    Create(G);
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		    G.arcs[i][j]=0;//初始化邻接矩阵 
	cout<<"依次输入图的弧头顶点和弧尾顶点:"<<endl;
	for(k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		G.arcs[i][j]=1;
	}
}
void CreateUDG(MGraph &G)
{
	int i,j,k;
	string v1,v2; 
    Create(G);
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		    G.arcs[i][j]=0;//初始化邻接矩阵 
	cout<<"依次输入图的弧连接的两顶点:"<<endl;
	for(k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		G.arcs[i][j]=1;
		G.arcs[j][i]=1;
	}
}
void CreateDN(MGraph &G)
{
	int i,j,k;
	string v1,v2; 
    Create(G); 
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		    G.arcs[i][j]=INFINITY;//初始化邻接矩阵 
	cout<<"依次输入图的弧头顶点和弧尾顶点及弧的权值:"<<endl;
	for(k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		cin>>G.arcs[i][j];
	}
}
void CreateUDN(MGraph &G)
{
	int i,j,k;
	string v1,v2; 
    Create(G);
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		    G.arcs[i][j]=INFINITY;//初始化邻接矩阵 
	cout<<"依次输入图的弧连接的两顶点及弧的权值:"<<endl;
	for(k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2;
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		cin>>G.arcs[i][j];
		G.arcs[j][i]=G.arcs[i][j]; 
	}
}
void PrintAdjMatrix(MGraph G)
{
	int i,j;
	for(i=0;i<G.vexnum;i++)
	{
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[i][j]==INFINITY)cout<<"∞"<<'\t';
			else cout<<G.arcs[i][j]<<'\t';
		}
		cout<<endl;
	}	
}
int visit1[MAX_VERTEX_NUM];
void DFS(MGraph G,int v)
{
	int w; 
	cout<<G.vexs[v]<<'\t';visit1[v]=1;//访问第v个顶点 
	for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行 
	{
		if(visit1[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0)
		DFS(G,w);
	}
} 
void BFS(MGraph G,int v)
{
	int i(0),j(1),w,visit2[G.vexnum];
	string  a[G.vexnum];
	cout<<G.vexs[v]<<'\t';visit2[v]=1;//访问第v个顶点
	a[i]=G.vexs[v];//深度优先数组 
	while(i<G.vexnum) 
	{		
		for(w=1;w<G.vexnum;w++)//依次检查邻接矩阵v所在行 
		{
			if(visit2[w]!=1&&G.arcs[v][w]!=INFINITY&&G.arcs[v][w]!=0)
			{
				cout<<G.vexs[w]<<'\t';visit2[w]=1;
				i++;a[i]=G.vexs[w];
			}
		}
		v=LocateVex(G,a[j]);j++;//依次访问深度优先数组 
	}
} 
int main()
{
	int v,choice;
	string vv; 
	MGraph G;
		system("cls");
		cout<<"图的种类:1有向图 2无向图 3有向网 4无向网"<<endl<<"你的选择:";
		cin>>choice;
		switch(choice)
		{
			case 1:
				{
					G.kind=DG;CreateDG(G);break; 
				}
			case 2:
				{
					G.kind=UDG;CreateUDG(G);break; 
				}
			case 3:
				{
					G.kind=DN;CreateDN(G);break; 
				}
			case 4:
				{
					G.kind=UDN;CreateUDN(G);break; 
				}
		} 
    PrintAdjMatrix(G);
    cout<<"从哪个顶点开始遍历:"; 
    cin>>vv;
    v=LocateVex(G,vv);
    cout<<"深度优先遍历:"; 
	DFS(G,v);
	cout<<endl<<"广度优先遍历:"; 
	BFS(G,v);
	return 0;
}/*
6 10
v1 v2 v3 v4 v5 v6
v1 v2 5
v2 v3 4
v3 v1 8
v1 v4 7
v3 v6 9
v6 v1 3
v4 v3 5
v4 v6 6
v6 v5 1
v5 v4 5*/
/*
7 8
A B C F L J M
A B
A C
A F
A L
B M
L J
L M
J M*/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值