⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch7.cpp

📁 邻接表
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#define N 20
#define INFINITY 99999
typedef enum{DG,DN,UDG,UDN}Graphkind;
typedef struct
{//邻接矩阵的类型定义
	char vexs[N];
	int arcs[N][N];
	int vexnum,arcnum;
	int kind;
}MGraph;
typedef struct ArcNode
{//邻接表的类型定义
	int adjvex;
	struct ArcNode *next;
}ArcNode;
typedef struct VNode
{
	char data;
	ArcNode *firstarc;
}VNode,AdjList[N];
typedef struct 
{
	AdjList vertice;
	int vexnum,arcnum;
	int kind;
}ALGraph;
typedef struct node {
		char adjvex;
		int lowcost;
	}close[N];
typedef struct Qnode
{
	int  data;
	struct Qnode *next;
}Qnode,*Queueptr;
typedef struct
{
	Queueptr front;
	Queueptr rear;
}Linkqueue; 
int Initqueue(Linkqueue &Q)
{
	Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode));
	if(!Q.front)
		exit(-2);
	Q.front->next=NULL;
	return 1;
}
int Enqueue(Linkqueue &Q,int e)
{   Queueptr p;
	p=(Queueptr)malloc(sizeof(Qnode));
	if(!p)
		exit(-2);
	p->data=e;p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return 1;
}
int Dequeue(Linkqueue &Q,int &e)
{   Qnode *p;
	if(Q.rear==Q.front)
		return -1;
	p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	if(Q.rear==p)
		Q.rear=Q.front;
	free(p);
	return 1;
} 
/*MGraph CreateUDN()
{
	int k;
    MGraph G;
	int i,j;
	int w;
	printf("输入顶点数和边数:");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	printf("依次输入顶点信息:");getchar();
	for(i=0;i<G.vexnum;i++)
		G.vexs[i]=getchar();
	getchar();
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;i++)
			G.arcs[i][j]=INFINITY;
		for(k=0;k<G.arcnum;k++)
		{
			printf("输入边依附的顶点和权值:");
			scanf("%d %d %d",&i,&j,&w);
			G.arcs[i][j]=w;
			G.arcs[j][i]=w;
		}
		return(G);
}
ALGraph CreateAdjlist()
{	
	ArcNode *s;
	int i,j,k;
	ALGraph G;
	printf("输入顶点数和边数:");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	printf("依次输入顶点信息:");
	for(i=0;i<G.vexnum;i++)
	{
		G.vertice[i].data=getchar();
		G.vertice[i].firstarc=NULL;
	}
	for(k=0;k<G.arcnum;k++)
	{
		printf("输入边依附的顶点:");
		scanf("%d %d",&i,&j);
		s=(ArcNode*)malloc(sizeof(ArcNode));
		s->adjvex=j;
		s->next=G.vertice[i].firstarc;
		G.vertice[i].firstarc=s;
		s=(ArcNode*)malloc(sizeof(ArcNode));
		s->adjvex=i;
		s->next=G.vertice[j].firstarc;
		G.vertice[j].firstarc=s;
	}
	return(G);
}*/
void Create_UDN_ADJLIST(MGraph &M,ALGraph &A)
{
	int i,j,k,w;
	ArcNode *s;
	printf("请输入图的顶点数和边数:");
	scanf("%d%d",&M.vexnum,&M.arcnum);
	A.vexnum=M.vexnum;
	A.arcnum=M.arcnum;
    M.kind=A.kind=UDN;
	for(i=0;i<M.vexnum;i++)
	{
		printf("请输入顶点名称:");
		getchar();
		M.vexs[i]=getchar();
		A.vertice[i].data=M.vexs[i];
		A.vertice[i].firstarc=NULL;
	}
	for(i=0;i<M.vexnum;i++)
	{
		for(j=0;j<M.vexnum;j++)
		{
			M.arcs[i][j]=INFINITY;
		}
	}
	for(k=0;k<M.arcnum;k++)
	{
		printf("输入邻接的两点的序号和相应的权值:");
		scanf("%d%d%d",&i,&j,&w);
		M.arcs[i][j]=w;
		M.arcs[j][i]=w;
		s=(ArcNode*)malloc(sizeof(ArcNode));
		s->adjvex=j;
		s->next=A.vertice[i].firstarc;
		A.vertice[i].firstarc=s;
		s=(ArcNode*)malloc(sizeof(ArcNode));
		s->adjvex=i;
		s->next=A.vertice[j].firstarc;
		A.vertice[j].firstarc=s;
	}
}
void dfs(ALGraph A,int v0,int visited[])
{
	ArcNode *p;
	visited[v0]=1;
	printf("%c",A.vertice[v0].data);
	p=A.vertice[v0].firstarc;
	while(p)
	{
		if(!visited[p->adjvex])
		{
			dfs(A,p->adjvex,visited);
		}
		p=p->next;
	}
}
void dfstraverse(ALGraph A,int visited[])
{
	int i,v;
	for(i=0;i<A.vexnum;i++)
	{
		visited[i]=0;
	}
	for(v=0;v<A.vexnum;v++)
	{
		if(!visited[v])
			dfs(A,v,visited);
	}
}
int minimum(MGraph G,close closedge)
{
	int min=INFINITY;
	int i,k;
	for(i=0;i<G.vexnum;i++)
	{
		if(closedge[i].lowcost!=0&&closedge[i].lowcost<min)
		{
			k=i;
			min=closedge[i].lowcost;
		}
	}
	return k;
}

void MiniSpanTree_PRIM(MGraph G,char u)
{
	int k,i,j,l=0;
	close closedge;
	while(G.vexs[l]!=u&&l<G.vexnum)
	{
		l++;
	}
	k=l;
	for(j=0;j<G.vexnum;j++)
	{
		if(j!=k)
		{
			closedge[j].adjvex=u;
			closedge[j].lowcost=G.arcs[k][j];
		}
		closedge[k].lowcost=0;
	}
	for(i=1;i<G.vexnum;i++)
	{
		k=minimum(G,closedge);
		printf("%c  %c",closedge[k].adjvex,G.vexs[k]);
		printf("\n");
		closedge[k].lowcost=0;
		for(j=0;j<G.vexnum;j++)
		{
			if(G.arcs[k][j]<closedge[j].lowcost)
			{
				closedge[j].adjvex=G.vexs[i];
				closedge[j].lowcost=G.arcs[k][j];
			}
		}
	}
}
void shorttestPast_PIJ(MGraph G,int v0,char p[N][N],int D[N])
{
	int final[N];
	int v,x,i,w,min;
	for(v=0;v<G.vexnum;v++)
	{
		final[v]=0;
		D[v]=G.arcs[v0][v];
		for(w=0;w<G.vexnum;w++)
		{
			p[v][w]=0;
		}
		if(D[N]<INFINITY)
		{
			p[v][v0]=1;p[v][v]=1;
		}
	}
	D[v0]=0;
	final[v0]=1;
	for(i=1;i<G.vexnum;i++)
	{
		min=INFINITY;
		for(w=0;w<G.vexnum;w++)
		{
			if(!final[w])
			{
				if(D[w]<min)
				{
					v=w;
					min=D[w];
				}
			}
		}
		final[v]=1;
		for(w=0;w<G.vexnum;w++)
		{
			if(!final[w]&&min+G.arcs[v][w]<D[w])
			{
				D[w]=min+G.arcs[v][w];
				for(x=0;x<G.vexnum;x++)
				{
					p[w][x]=p[v][x];
				}
				p[w][w]=1;
			}
		}
	}
}
void bfs(ALGraph G)      
{ 
	int v,u,w;
	ArcNode *p;
    Linkqueue  Q;
    int visited[N];
	for ( v=0; v<G.vexnum; v++) 
		visited[v]=0;
	Initqueue(Q);
    for ( v=0; v<G.vexnum; v++)
	{
		if ( !visited[v]) 
		{
			visited[v]=1; 
			printf("%c",G.vertice[v].data );
			Enqueue(Q, v);
		}
	}
	while (Q.front!=Q.rear)
	{  
		Dequeue(Q, u);
		p= G.vertice[u].firstarc;
		while (p!=NULL)
		{  
			w=p->adjvex;
			if (!visited[w])
			{
				visited[w]=1; 
				printf("%c", G.vertice[w].data );
				Enqueue(Q, w);   
			}  //if
        p=p->next;
      }  //while
   }  //while
}  
void main()
{
	MGraph M;
	ALGraph A;
	char p[N][N];
	int D[N];
	int visited1[N];
	int i,j;
    Create_UDN_ADJLIST(M,A);
	printf("dfs序列:");
    dfstraverse(A,visited1);
	printf("\n");
	printf("bfs序列:");
	bfs(A);
	printf("\n");
	printf("minispantree:\n");
	MiniSpanTree_PRIM(M,M.vexs[0]);
	printf("\n");
	printf("shortpast:\n");
	shorttestPast_PIJ(M,2,p,D);
	for(i=0;i<M.vexnum;i++)
	{
		for(j=0;j<M.vexnum;j++)
		{
			if(p[i][j]==1)
				printf("%c",M.vexs[j]);
		}
		printf("\n%d\n",D[i]);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -