期末复习题_数图

13. 2023-期末复习-图的遍历-广度优先搜索遍历连通图-邻接矩阵法
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


#include "stdio.h"    

#include "stdlib.h"   


#include "math.h"  

#include "time.h"


#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0


typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


typedef char VertexType; /* 顶点类型 */

typedef int EdgeType; /* 边上的权值类型 */


#define MAXSIZE 9 /* 存储空间初始分配量 */

#define MAXEDGE 15

#define MAXVEX 9


typedef struct

{

	VertexType vexs[MAXVEX]; /* 顶点表 */
	
	EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
	
	int numVertexes, numEdges; /* 图中当前的顶点数和边数 */

}MGraph;


/* 用到的队列结构与函数********************************** */


/* 循环队列的顺序存储结构 */

typedef struct

{

	int data[MAXSIZE];
	
	int front;    	/* 头指针 */
	
	int rear;/* 尾指针,若队列不空,指向队列尾元素的下一个位置 */

}Queue;


/* 初始化一个空队列Q */

Status InitQueue(Queue* Q)

{

	Q->front = 0;

	Q->rear = 0;

	return  OK;

}


/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */

Status QueueEmpty(Queue Q)

{

	if (Q.front == Q.rear) /* 队列空的标志 */
	
		return TRUE;
	
	else
	
		return FALSE;

}


/* 若队列未满,则插入元素e为Q新的队尾元素 */

Status EnQueue(Queue* Q, char e)

{

	if ((Q->rear + 1) % MAXSIZE == Q->front)/* 队列满的判断 */

		return ERROR;

	Q->data[Q->rear] = e;/* 将元素e赋值给队尾 */

	Q->rear = (Q->rear + 1) % MAXSIZE;/* rear指针向后移一位置, */

/* 若到最后则转到数组头部 */

	return  OK;

}


/* 若队列不空,则删除Q中队头元素,用e返回其值 */

Status DeQueue(Queue* Q, char* e)

{

	if (Q->front == Q->rear)/* 队列空的判断 */
	
		return ERROR;
	
	*e = Q->data[Q->front];/* 将队头元素赋值给e */
	
	Q->front = (Q->front + 1) % MAXSIZE;/* front指针向后移一位置, */
	
	/* 若到最后则转到数组头部 */
	
	return  OK;

}

/* ****************************************************** */



void CreateMGraph(MGraph* G)

{

	int i, j;


	G->numEdges = 15;

	G->numVertexes = 9;


/* 读入顶点信息,建立顶点表 */

	G->vexs[0] = 'A';

	G->vexs[1] = 'B';

	G->vexs[2] = 'C';

	G->vexs[3] = 'D';

	G->vexs[4] = 'E';

	G->vexs[5] = 'F';

	G->vexs[6] = 'G';

	G->vexs[7] = 'H';

	G->vexs[8] = 'I';



	for (i = 0; i < G->numVertexes; i++)/* 初始化图 */
	
	{
	
		for (j = 0; j < G->numVertexes; j++)
		
		{
		
			G->arc[i][j] = 0;
		
		}
	
	}


	G->arc[0][1] = 1;

	G->arc[0][5] = 1;


	G->arc[1][2] = 1;

	G->arc[1][8] = 1;

	G->arc[1][6] = 1;


	G->arc[2][3] = 1;

	G->arc[2][8] = 1;


	G->arc[3][4] = 1;

	G->arc[3][7] = 1;

	G->arc[3][6] = 1;

	G->arc[3][8] = 1;

	G->arc[4][5] = 1;

	G->arc[4][7] = 1;

	G->arc[5][6] = 1;

	G->arc[6][7] = 1;

	for (i = 0; i < G->numVertexes; i++)	
	{	
		for (j = i; j < G->numVertexes; j++)		
		{		
			G->arc[j][i] = G->arc[i][j];		
		}	
	}
}

/*
1.这里没说从哪个顶点开始进行广度搜索,就从第一个节点进行
2,要建立一个visit数组记录每个节点的访问情况
3.如果该结点没有进行过访问,就开始对这个节点进行访问,并将该节点的visit储存的状态置为真。
4.然后要依次遍历与该节点相连的节点,先将自己进行入队,接下来进行循环
5.出队,遍历至第一个到与之相连的且没有访问过的节点,对它进行访问,然后将其visit状态置为真,将其入队。
*/


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

void BFSTraverse(MGraph G)
{
   /*请补充代码*/
   int i, j;
   Queue Q;
   InitQueue(&Q);
   int visit[MAXVEX] ;
   for(i = 0 ;i < MAXVEX; i ++)
   {
   		visit[i] = FALSE; 
	}
	
	for(i = 0; i < G.numVertexes ;i ++)
	{
		if(!visit[i]) 
		{
			printf("%c ",G.vexs[i]);	
			visit[i] = TRUE;
			EnQueue(&Q, i);
			while(!QueueEmpty(Q))
			{
				char j;
				DeQueue(&Q, &j);	
				int k = 0;
				for(; k < G.numVertexes; k ++)
				{
					if(G.arc[j][k] != 0 && visit[k] != TRUE)
					{
						printf("%c ", G.vexs[k]);
						visit[k] = TRUE;
						EnQueue(&Q, k); 
					}
				}
			}	
		}	
	} 
	
   
   
}
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


int main(void)

{

	MGraph G;

	CreateMGraph(&G);

	printf("广度遍历:");

	BFSTraverse(G);

	printf("\n");

	return 0;

}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */


14. 2023级-04班-期末复习题-图的遍历-深度优先遍历连通图-邻接矩阵法
//编写DFSTraverse函数

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


#include "stdio.h"    

#include "stdlib.h"   


#include "math.h"  

#include "time.h"


#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0


typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


typedef char VertexType; /* 顶点类型 */

typedef int EdgeType; /* 边上的权值 */


#define MAXSIZE 9 /* 存储空间初始分配量 */

#define MAXEDGE 15

#define MAXVEX 9


typedef struct

{

	VertexType vexs[MAXVEX]; /* 顶点表 */

	EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */

	int numVertexes, numEdges; /* 图中当前的顶点数和边数 */

}MGraph;


void CreateMGraph(MGraph* G)

{

	int i, j;


	G->numEdges = 15;

	G->numVertexes = 9;


	/* 读入顶点信息,建立顶点表 */

	G->vexs[0] = 'A';

	G->vexs[1] = 'B';

	G->vexs[2] = 'C';

	G->vexs[3] = 'D';

	G->vexs[4] = 'E';

	G->vexs[5] = 'F';

	G->vexs[6] = 'G';

	G->vexs[7] = 'H';

	G->vexs[8] = 'I';



	for (i = 0; i < G->numVertexes; i++)/* 初始化图 */

	{

		for (j = 0; j < G->numVertexes; j++)

		{

			G->arc[i][j] = 0;

		}

	}


	G->arc[0][1] = 1;

	G->arc[0][5] = 1;


	G->arc[1][2] = 1;

	G->arc[1][8] = 1;

	G->arc[1][6] = 1;


	G->arc[2][3] = 1;

	G->arc[2][8] = 1;


	G->arc[3][4] = 1;

	G->arc[3][7] = 1;

	G->arc[3][6] = 1;

	G->arc[3][8] = 1;


	G->arc[4][5] = 1;

	G->arc[4][7] = 1;


	G->arc[5][6] = 1;


	G->arc[6][7] = 1;



	for (i = 0; i < G->numVertexes; i++)

	{

		for (j = i; j < G->numVertexes; j++)

		{

			G->arc[j][i] = G->arc[i][j];

		}

	}


}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

void DFSTraverse(MGraph G)
{
   /*请补充代码*/
   int i = 0;
   int visit[G.numVertexes + 1];
   for(i = 0; i < G.numVertexes; i++)
   {
   		visit[i] = FALSE;
	} 
	int stack[MAXVEX];
	int top = -1;
	for(i = 0 ;i < G.numVertexes ;i ++)
	{
		if(visit[i] == FALSE)
		{			
			stack[++top] = i;
			while(top != -1)
			{
				int temp = stack[top--];
				if(visit[temp] == FALSE)
				{
					printf("%c ",G.vexs[temp]);
					visit[temp] = TRUE;
					int k = 0;
					for(k = G.numVertexes - 1; k >= 0 ; k --)
					{
						if(G.arc[temp][k] != 0 && visit[k] == FALSE)
						{
							stack[++top] = k;
						}
					}
				}
			}
		}
	 } 
}
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


int main(void)

{

	MGraph G;

	CreateMGraph(&G);

	printf("深度遍历:");

	DFSTraverse(G);

	printf("\n");

	return 0;

}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
15. 2023-期末复习-图的广度优先搜索-邻接表法
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


#include "stdio.h"

#include "stdlib.h"


#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0



#define MAXSIZE 8 /* 存储空间初始分配量 */

#define MAXEDGE 9 /* 存储空间初始分配量 */


#define MAXVEX 8


typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */


typedef struct EdgeNode//边表节点

{

    int adjvex;//存储该顶点对应的下标

    struct EdgeNode *next;//指向该顶点的下一个邻接点

}EdgeNode;


typedef struct VertexNode//顶点表结点

{

    char data;//顶点

    EdgeNode *firstedge;//边表头指针

}VertexNode;


typedef struct//图的邻接表存储结构

{

    VertexNode adjList[MAXVEX];//有4个VertexNode这种类型的顶点,定义一个数组adjList[4],每个元素是VertexNode类型

    int numVertexes,numEdges;//图中顶点数和边数,这里是4,5

}GraphAdjList;


void CreateALGraph(GraphAdjList *p)//无向图的邻接表创建

{

int k;

int i;

int j;

    GraphAdjList *Gp=(GraphAdjList *)malloc(sizeof(GraphAdjList));

    EdgeNode *pe;

	printf("请输入顶点数和边数:\n");

	scanf("%d %d",&(Gp->numVertexes),&(Gp->numEdges));

	printf("请输入顶点数的数据:\n");

	getchar();

    for (k = 0; k < Gp->numVertexes; k++)

{

		scanf("%c",&(Gp->adjList[k].data));

		getchar();

Gp->adjList[k].firstedge = NULL;//将边表头指针指向NULL,即置为0

    }

	printf("请输入边的数据:\n");

for (k = 0; k <  Gp->numEdges; k++)//建立边表

{

		scanf("%d %d",&i,&j);

		getchar();

        pe = (EdgeNode *)malloc(sizeof(EdgeNode));

        pe->adjvex = j;// 邻接序号为j

        pe->next = Gp->adjList[i].firstedge;//将pe的指针指向当前顶点指向的结点

        Gp->adjList[i].firstedge = pe;//将当前顶点的指针指向pe


        pe = (EdgeNode *)malloc(sizeof(EdgeNode));

        pe->adjvex = i;

        pe->next = Gp->adjList[j].firstedge;

        Gp->adjList[j].firstedge = pe;//无序图重复上面步骤

    }

*p=*Gp;

}


/* 用到的队列结构与函数********************************** */


/* 循环队列的顺序存储结构 */

typedef struct

{

	int data[MAXSIZE];
	
	int front;    	/* 头指针 */
	
	int rear;/* 尾指针,若队列不空,指向队列尾元素的下一个位置 */

}Queue;


/* 初始化一个空队列Q */

Status InitQueue(Queue* Q)

{

	Q->front = 0;

	Q->rear = 0;

	return  OK;

}


/* 若队列Q为空队列,则返回TRUE,否则返回FALSE */

Status QueueEmpty(Queue Q)

{

	if (Q.front == Q.rear) /* 队列空的标志 */
	
		return TRUE;
	
	else
		
		return FALSE;
	
}


/* 若队列未满,则插入元素e为Q新的队尾元素 */

Status EnQueue(Queue* Q, char e)

{

	if ((Q->rear + 1) % MAXSIZE == Q->front)/* 队列满的判断 */
	
		return ERROR;

	Q->data[Q->rear] = e;/* 将元素e赋值给队尾 */

	Q->rear = (Q->rear + 1) % MAXSIZE;/* rear指针向后移一位置, */

/* 若到最后则转到数组头部 */
	
	return  OK;

}


/* 若队列不空,则删除Q中队头元素,用e返回其值 */

Status DeQueue(Queue* Q, int* e)

{

	if (Q->front == Q->rear)/* 队列空的判断 */
		
		return ERROR;
	
	*e = Q->data[Q->front];/* 将队头元素赋值给e */
	
	Q->front = (Q->front + 1) % MAXSIZE;/* front指针向后移一位置, */
	
	/* 若到最后则转到数组头部 */
	
	return  OK;

}

/* ****************************************************** */


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

/*
先打印再入队,这样就少了一次条件判断,而且那个条件判断不好加,会影响后面的循环。所以就采用这种方式
*/

void BFSTraverse(GraphAdjList G)
{
   /*请补充代码*/
   int i , j ;
   int visit[MAXVEX] ;
   for(i = 0; i < MAXVEX; i++)
   {
   		visit[i] = FALSE;
   }
   Queue Q;
   InitQueue(&Q);
   for(i = 0; i < G.numVertexes; i ++)
   {
   		if(visit[i] == FALSE)
   		{
   			printf("%c ",G.adjList[j].data);
			visit[j] = TRUE;
   			EnQueue(&Q, i);
			while(!QueueEmpty(Q))
			{
				int j;
				DeQueue(&Q, &j);
				EdgeNode *p = G.adjList[j].firstedge;
                while (p)
                {
                    if (!visit[p->adjvex])
                    {
                        visit[p->adjvex] = TRUE;
                        printf("%c ", G.adjList[p->adjvex].data);
                        EnQueue(&Q, p->adjvex);
                    }
                    p = p->next;
                }
							
			}	
		}
   }
   
}
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


int main(void)

{

    GraphAdjList p;

    CreateALGraph(&p);

    BFSTraverse(p);//输出的遍历顺序是ADCB

	printf("\n");

    return 0;

}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */


16. 2023级-04班-期末复习题-图的深度优先搜索-邻接表法
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



#include "stdio.h"

#include "stdlib.h"



typedef struct EdgeNode//边表节点

{

   int adjvex;//存储该顶点对应的下标

   struct EdgeNode *next;//指向该顶点的下一个邻接点

}EdgeNode;



typedef struct VertexNode//顶点表结点

{

   char data;//顶点

   EdgeNode *firstedge;//边表头指针

}VertexNode;



typedef struct//图的邻接表存储结构

{

   VertexNode adjList[4];//有4个VertexNode这种类型的顶点,定义一个数组adjList[4],每个元素是VertexNode类型

   int numVertexes,numEdges;//图中顶点数和边数,这里是4,5

}GraphAdjList;



void CreateALGraph(GraphAdjList *p)//无向图的邻接表创建

{

int k;

int i;

int j;

   GraphAdjList *Gp=(GraphAdjList *)malloc(sizeof(GraphAdjList));

   EdgeNode *pe;

printf("请输入顶点数和边数:\n");

scanf("%d %d",&(Gp->numVertexes),&(Gp->numEdges));

printf("请输入顶点数的数据:\n");

getchar();

   for (k = 0; k < Gp->numVertexes; k++)

{

scanf("%c",&(Gp->adjList[k].data));

getchar();

Gp->adjList[k].firstedge = NULL;//将边表头指针指向NULL,即置为0

   }

printf("请输入边的数据:\n");

for (k = 0; k <  Gp->numEdges; k++)//建立边表

{

scanf("%d %d",&i,&j);

getchar();

       pe = (EdgeNode *)malloc(sizeof(EdgeNode));

       pe->adjvex = j;// 邻接序号为j

       pe->next = Gp->adjList[i].firstedge;//将pe的指针指向当前顶点指向的结点

       Gp->adjList[i].firstedge = pe;//将当前顶点的指针指向pe



       pe = (EdgeNode *)malloc(sizeof(EdgeNode));

       pe->adjvex = i;

       pe->next = Gp->adjList[j].firstedge;

       Gp->adjList[j].firstedge = pe;//无序图重复上面步骤

   }

*p=*Gp;

}



/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

void DFSTraverse(GraphAdjList G)
{
   /*请补充代码*/
   int stack[G.numVertexes];
   int top = -1;
   int visit[G.numVertexes];
   int i;
   for(i = 0 ;i <G.numVertexes ;i ++)
   {
   		visit[i] = 0;
   }
   for(i = 0; i < G.numVertexes ;i ++)	
   {
   		if(visit[i] == 0){
   			printf("%c ", G.adjList[i].data);
   			visit[i] = 1;
   			stack[++top] = i;
   			while(top != -1){
   				int u = stack[top --];
   				EdgeNode *p = G.adjList[u].firstedge;
				if(visit[p->adjvex] == 0){
					printf("%c ", G.adjList[p->adjvex].data);
					visit[p->adjvex] = 1;
					stack[++top] = p->adjvex;
				   }
			   }
		   }
	} 
   
   
}
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



int main(void)

{

   GraphAdjList p;

   CreateALGraph(&p);

   DFSTraverse(p);//输出的遍历顺序是ADCB
	
	printf("\n");

   return 0;

}



/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
17. 2023-期末复习-图的连通性判断和连通分量计算
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


#include "stdio.h"    

#include "stdlib.h"   


#include "math.h"  

#include "time.h"


#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0


typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


typedef char VertexType; /* 顶点类型 */

typedef int EdgeType; /* 边上的权值 */


#define MAXSIZE 9 /* 存储空间初始分配量 */

#define MAXEDGE 4

#define MAXVEX 6


typedef struct

{

VertexType vexs[MAXVEX]; /* 顶点表 */

EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */

int numVertexes, numEdges; /* 图中当前的顶点数和边数 */

}MGraph;


int count =0;//连通分量的个数,全局变量


void CreateMGraph(MGraph* G)

{

int i, j;


	G->numEdges = 4;

	G->numVertexes = 6;


/* 读入顶点信息,建立顶点表 */

	G->vexs[0] = 'A';

	G->vexs[1] = 'B';

	G->vexs[2] = 'C';

	G->vexs[3] = 'D';

	G->vexs[4] = 'E';

	G->vexs[5] = 'F';



for (i = 0; i < G->numVertexes; i++)/* 初始化图 */

{

for (j = 0; j < G->numVertexes; j++)

{

			G->arc[i][j] = 0;

}

}


	G->arc[0][1] = 1;

	G->arc[0][5] = 1;

	G->arc[1][2] = 1;

	G->arc[3][4] = 1;



for (i = 0; i < G->numVertexes; i++)

{

for (j = i; j < G->numVertexes; j++)

{

			G->arc[j][i] = G->arc[i][j];

}

}


}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

int DFSTraverse(MGraph G)
{
   /*请补充代码*/
	int i;
	int stack[G.numVertexes];
	int top = -1;
	int visit[G.numVertexes];
	for(i = 0;i < G.numVertexes ;i ++)
	{
		visit[i] = 0;
	}
	for(i = 0;i < G.numVertexes;i ++)
	{
		if(visit[i] == 0)
		{
			visit[i] = 1;
			stack[++top] = i;
			while(top != -1){
				int u = stack[top --];
				int k = 0;
				for(k = 0;k < G.numVertexes;k ++)
				{
					if(G.arc[u][k] != 0 && visit[k] == 0)
					{
						visit[k] = 1;
						stack[++top] = k;
					}
				}
			}  
			count++;
		}
	}
	return count > 1 ? 0 : 1 ;
}
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */


int main(void)

{

MGraph G;

int connect;

CreateMGraph(&G);

	connect=DFSTraverse(G);

if(connect)

{

		printf("该无向图全连通:\n");

}

else

{

		printf("该无向图不是全连通,其连通分量个数为:%d\n",count);

}

return 0;

}


/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
18. 2023级-04班-期末复习题-判断图的顶点连通性
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#define TRUE 1

int visited[4];

typedef struct EdgeNode//边表节点

{

   int adjvex;//存储该顶点对应的下标

   struct EdgeNode *next;//指向该顶点的下一个邻接点

}EdgeNode;

typedef struct VertexNode//顶点表结点

{

   char data;//顶点

   EdgeNode *firstedge;//边表头指针

}VertexNode;

typedef struct//图的邻接表存储结构

{

   VertexNode adjList[4];//有4个VertexNode这种类型的顶点,定义一个数组adjList[4],每个元素是VertexNode类型

   int numVertexes,numEdges;//图中顶点数和边数,这里是4,5

}GraphAdjList;

void CreateALGraph(GraphAdjList *p)//无向图的邻接表创建

{

int k;

int i;

int j;

   GraphAdjList *Gp=(GraphAdjList *)malloc(sizeof(GraphAdjList));

   EdgeNode *pe;

printf("请输入顶点数和边数:\n");

scanf("%d %d",&(Gp->numVertexes),&(Gp->numEdges));

printf("请输入顶点数的数据:\n");

getchar();

   for (k = 0; k < Gp->numVertexes; k++)

{

scanf("%c",&(Gp->adjList[k].data));

getchar();

Gp->adjList[k].firstedge = NULL;//将边表头指针指向NULL,即置为0

visited[k]=0;

}

printf("请输入边的数据:\n");

for (k = 0; k <  Gp->numEdges; k++)//建立边表

{

scanf("%d %d",&i,&j);

getchar();

       pe = (EdgeNode *)malloc(sizeof(EdgeNode));

       pe->adjvex = j;// 邻接序号为j

       pe->next = Gp->adjList[i].firstedge;//将pe的指针指向当前顶点指向的结点

       Gp->adjList[i].firstedge = pe;//将当前顶点的指针指向pe

       pe = (EdgeNode *)malloc(sizeof(EdgeNode));

       pe->adjvex = i;

       pe->next = Gp->adjList[j].firstedge;

       Gp->adjList[j].firstedge = pe;//无序图重复上面步骤

   }

*p=*Gp;

}

int LocateVex(GraphAdjList G,char u)

{ // 初始条件: 图G存在,u和G中顶点有相同特征

  // 操作结果: 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1

  int i;

  for(i=0;i < G.numVertexes;i ++)
  {
  		if(G.adjList[i].data == u)	return i;
  }

    return -1;

}

int NextAdjVex(GraphAdjList G,int v,int w)

{ // 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点

  // 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号。

  // 若w是v的最后一个邻接点,则返回-1

  EdgeNode *p;

  p=G.adjList[v].firstedge;

  while(p&&p->adjvex!=w)  

  {

  p=p->next;

  }

  if(!p||!p->next)  //没找到w或w是最后一个邻接点

    return -1;

  else   //p->adjvex==w

    return p->next->adjvex;

}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE */

//补充函数代码

void isConnected(GraphAdjList G, int v1, int v2, int *flag)
{
	if(v1 == v2)	
	{
		*flag = TRUE;
		return ;
	}
	EdgeNode *p;
	p=G.adjList[v1].firstedge;
	while(p)
	{
		int res = NextAdjVex(G, p->adjvex, v2);
		if(res == -1)
			p = p->next;
		else
		{
			*flag = 1;
			return;
		}
	}	
}



/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

int main(void)

{

   GraphAdjList p;

char u1;

char u2;

int v1;

int v2;

int flag=0;

   CreateALGraph(&p);

printf("输入两个顶点:\n");

scanf("%c %c",&u1,&u2);

v1=LocateVex(p,u1);

v2=LocateVex(p,u2);

isConnected(p,v1,v2,&flag);

if(flag)

{

printf("顶点相通\n");

}

else

{

printf("顶点不相通\n");

}

   return 0;

}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
19. 2023级-04班-期末复习题-图的回路判断
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



#include "stdio.h"    

#include "stdlib.h"  



#include "math.h"  

#include "time.h"



#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0



typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef char VertexType; /* 顶点类型 */

typedef int EdgeType; /* 边上的权值 */


#define MAXSIZE 9 /* 存储空间初始分配量 */

#define MAXEDGE 6

#define MAXVEX 6

int visited[MAXVEX]; /* 访问标志的数组 */ 
int parent[MAXVEX]; /*父链接结点*/


typedef struct

{

VertexType vexs[MAXVEX]; /* 顶点表 */

EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */

int numVertexes, numEdges; /* 图中当前的顶点数和边数 */

}MGraph;



int count =0;//连通分量的个数,全局变量



void CreateMGraph(MGraph* G)

{

int i, j;



G->numEdges = MAXEDGE;

G->numVertexes = MAXVEX;



/* 读入顶点信息,建立顶点表 */

G->vexs[0] = 'A';

G->vexs[1] = 'B';

G->vexs[2] = 'C';

G->vexs[3] = 'D';

G->vexs[4] = 'E';

G->vexs[5] = 'F';





for (i = 0; i < G->numVertexes; i++)/* 初始化图 */

{

for (j = 0; j < G->numVertexes; j++)

{

G->arc[i][j] = 0;

}

}



G->arc[0][1] = 1;

G->arc[0][4] = 1;

G->arc[0][5] = 1;

G->arc[1][2] = 1;

G->arc[2][3] = 1;

G->arc[3][4] = 1;





for (i = 0; i < G->numVertexes; i++)

{

for (j = i; j < G->numVertexes; j++)

{

G->arc[j][i] = G->arc[i][j];

}

}



}



int LocateVex(MGraph G, VertexType e)

{

// 初始条件:图G存在,u和G中顶点有相同特征

// 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1

//补充函数
	
	int i = 0;
	for(;i < G.numVertexes;i ++)
	{
		if(G.vexs[i] == e)	return i;
	 } 
	 return -1;

}


Status FindCycle(MGraph G, int v0) {
    int i, u, v;

    for (i = 0; i < G.numVertexes; i++) 
    {
        visited[i] = 0; // Initialize all vertices as not visited
        parent[i] = -1; // Initialize parent array
    }

    for (u = 0; u < G.numVertexes; u++) 
    {
        if (!visited[u]) 
        { // Don't recur for already visited vertices
            int stack[MAXVEX], top = -1;
            stack[++top] = u; // Push the current source node

            while (top != -1) 
            {
                v = stack[top--]; // Pop a vertex from stack
                visited[v] = 1; // Mark the node as visited

                for (i = 0; i < G.numVertexes; i++) 
                {
                    if (G.arc[v][i]) 
                    { // If there is an edge
                        if (!visited[i]) 
                        { // If the adjacent node is not visited
                            stack[++top] = i; // Push the adjacent node onto the stack
                            parent[i] = v; // Mark the parent of the adjacent node
                        } 
                        else if (i != parent[v]) 
                        { // If an adjacent is visited and not parent of current vertex
                            return TRUE; // Cycle detected
                        }
                    }
                }
            }
        }
    }
    return FALSE; // If no cycle is detected
}


/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */



int main(void)

{

MGraph G;

int flag=0;

int i;

CreateMGraph(&G);

for(i=0;i< MAXVEX ;i++)

{

visited[i]=0;

parent[i]=-1;

}

flag=FindCycle(G,0);

if(!flag)

{

printf("图没有回路\n");

}

else

{

printf("图有回路\n");

}

return 0;

}



/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值