其他分享
首页 > 其他分享> > 图的基本运算及智能交通中的最佳路径选择问题

图的基本运算及智能交通中的最佳路径选择问题

作者:互联网

图的基本运算及智能交通中的最佳路径选择问题

完成邻接矩阵的初始化、撤销和边的搜索、插入、删除等操作

#include <stdio.h>
#include <stdlib.h>


#define ERROR 0
#define OK 1
#define Overflow 2      //表示上溢
#define Underflow 3     //表示下溢
#define NotPresent 4    //表示元素不存在
#define Duplicate 5     //表示有重复元素
typedef int Status;
typedef int ElemType;
//图的邻接矩阵结构体
typedef struct mGraph
{
    ElemType **a;       //邻接矩阵
    int n;              //图的当前顶点数
    int e;              //图的当前边数
    ElemType noEdge;    //两顶点间无边时的值
}mGraph;

//邻接矩阵的初始化
Status Init(mGraph *mg, int nSize, ElemType noEdgeValue)
{
    
    int i, j;
    mg->n = nSize;              //初始化顶点数
    mg->e = 0;                  //初始化没有边
    mg->noEdge = noEdgeValue;   //初始化时没有边时的取值
    mg->a = (ElemType **)malloc(nSize * sizeof(ElemType *));    //动态生成长度为n的一维指针数组
    if(!mg->a)
        return ERROR;
    for (i = 0; i < mg->n; i++)     //动态生成二位数组
    {
        mg->a[i] = (ElemType *)malloc(nSize * sizeof(ElemType));
        for ( j = 0; j < mg->n; j++)
            mg->a[i][j] = mg->noEdge;
        mg->a[i][i] = 0;
        
    }
    return OK; 
}

//邻接矩阵的撤销
void Destroy(mGraph *mg)
{
    int i;
    mg->n = 0;
    mg->e = 0;
    for(i = 0; i < mg->n; i++)
        free(mg->a[i]);
    free(mg->a);
}

//边的搜索
Status Exit(mGraph *mg, int u, int v)
{
    if(u < 0 || v < 0 || u > mg->n - 1 || v > mg->n - 1 || u == v || mg->a[u][v] == mg->noEdge)
        return ERROR;
    return OK;
}

//边的插入
Status Insert (mGraph * mg, int u, int v, ElemType w)
{
    if(u < 0 || v < 0 || u > mg->n - 1 || v > mg->n - 1 || u == v)
        return ERROR;
    if(mg->a[u][v] != mg->noEdge)
        return Duplicate;       //若待插入边已存在, 则返回错误信息
    mg->a[u][v] = w;
    mg->e++;
    return OK;
}

//边的删除
Status Remove(mGraph *mg, int u, int v)
{
    if(u < 0 || v < 0 || u > mg->n - 1 || v > mg->n - 1 || u == v)
        return ERROR;
    if(mg->a[u][v] == mg->noEdge)
        return NotPresent;  //待删除边不存在
    mg->a[u][v] = mg->noEdge;
    mg->e--;
    return OK;
}

int main()
{
    mGraph mg;
    mg.n = 0;
    mg.e = 0;
    int m, n, u, v, w, a, b; //n顶点个数, m边的个数
    int choice;
    printf("请输入你想要的功能:\n0. 退出。\n1.创建邻接矩阵。\n2.查询边的权重。\n3.撤销邻接矩阵。\n4.删除边\n");
    while (1)
    {
        printf("\n请输入你的选择:");
        scanf("%d", &choice);
        if(choice == 0)
        {
            if (mg.n)
                printf("所创建邻接矩阵未撤销,请撤销后退出!!!\n");
            else
                break;
        }
                 
        switch (choice)
        {
        case 1:
            if(mg.n)
            {
                printf("已经创建邻接矩阵,请撤销后,重新创建。\n");
                break;
            }
            printf("请输入顶点个数:");
            scanf("%d", &n);
            Init(&mg, n, 0);
            printf("请输入插入边的个数:");
            scanf("%d", &m);
            for (int i = 0; i < m; i++)
            {
                printf("请输入第%d条边插入边的起点、终点以及边权:", i + 1);
                scanf("%d%d%d", &u, &v, &w);
                Insert(&mg, u, v, w);
            }
            break;
        case 2:
            if(!mg.n)
            {
                printf("未创建邻接矩阵,请创建后查询。\n");
                break;
            }
            printf("请输入查询边的起点及终点:");
            scanf("%d%d", &a, &b);
            if (Exit(&mg, a, b))
                printf("该边的边权为:%d\n", mg.a[a][b]);
            else
                printf("该边不存在\n");
            
            break;
        case 3:
            if(!mg.n)
            {
                printf("未创建邻接矩阵,请创建后撤销。\n");
                break;
            }
            Destroy(&mg);
            printf("已撤销");
            break;
        case 4:
            if(!mg.n)
            {
                printf("未创建邻接矩阵,请创建。\n");
                break;
            }
            printf("请输入删除边的起点及终点:");
            scanf("%d%d", &a, &b);
            if(Remove(&mg, a, b))
                printf("删除成功。\n");
            else
                printf("该边不存在。\n");
            break;
        default:
            printf("请正确输入选项。\n");
            break;
        }
    }

    system("pause");
    return 0;
    
}

图的宽度遍历和深度遍历


//队列结构体
typedef struct queue
{
	int front;
	int rear;
	int maxSize;
	int *element;
}queue;
//初始化队列
void initqueue(queue *q, int msize)
{
	q->maxSize = msize;
	q->element = (int *)malloc(msize * sizeof(int));
	q->front = q->rear = 0;
}
//入队列
int enqueue(queue * q, int m)
{
	if ((q->rear + 1) % q->maxSize == q->front)
	{
		printf("队列已满");
		return ERROR;
	}
	q->rear = (q->rear + 1) % q->maxSize;
	q->element[q->rear] = m;
	return OK;
}
//判断是否为空
int isEmpty(queue * q)
{
	return q->front == q->rear;
}
//出队列,返回队首
int dequeue(queue * q)
{
	if (isEmpty(q))
	{
		printf("队列为空");
		return ERROR;
	}
	q->front = (q->front + 1) % q->maxSize;
	return q->element[q->front];
}


//图的深度优先遍历
void DFS(int v, int visited[], mGraph *mg)
{
	visited[v] = 1;
	printf("%d ", v);
	for (int i = 0; i < mg->n; i++)
	{
		if (mg->a[v][i] != mg->noEdge && visited[i] != 1)
			DFS(i, visited, mg);
	}
}

void DFSGraph(mGraph * mg)
{
	int * visited = (int *)malloc(mg->n);
	for (int i = 0; i < mg->n; i++)
		visited[i] = 0;
	for (int i = 0; i < mg->n; i++)
		if (!visited[i])
			DFS(i, visited, mg);
	free(mg);
}

//宽度优先遍历
void BFS(int v, int visited[], mGraph *mg)
{
	queue q;
	initqueue(&q, mg->n);
	visited[v] = 1;
	printf("%d ", v);
	enqueue(&q, v);
	while (isEmpty(&q))
	{
		v = dequeue(&q);
		for (int i = 0; i < mg->n; i++)
		{
			if (mg->a[v][i] != mg->noEdge && visited[i] != 1)
			{
				visited[i] = 1;
				printf("%d ", i);
				enqueue(&q, i);
			}
		}

	}

}
void BFSGraph(mGraph *mg)
{
	int * visited = (int *)malloc(mg->n);
	for (int i = 0; i < mg->n; i++)
		visited[i] = 0;
	for (int i = 0; i < mg->n; i++)
		if (!visited[i]) BFS(i, visited, mg);
			free(visited);
}

邻接表实现上诉的功能

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

//循环队列的结构体定义
typedef struct{
    int front;
    int rear;
    int maxSize;    //最大容量
    ElemType *element;
}Queue;
 
 
//创建一个能容纳mSize个单元的空队列
void Create(Queue *Q,int mSize){
    Q->maxSize=mSize;
    Q->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
    Q->front=Q->rear=0;
}
 
 
//判断队列是否为空,若是,则返回TRUE;否则返回FALSE
int IsEmpty(Queue *Q){
    return Q->front==Q->rear;
}
 
 
//判断队列是否已满,若是,则返回TRUE,否则返回FALSE
int IsFULL(Queue *Q){
    return (Q->rear+1)%Q->maxSize==Q->front;
}
 
 
//获取队头元素,并通过x返回.若操作成功,则返回TRUE,否则返回FALSE
int Front(Queue *Q,ElemType *x){
    if(IsEmpty(Q))      //空队列处理
        return 0;
    *x=Q->element[(Q->front+1)%Q->maxSize];
}

 
 
//入队.在队列Q的队尾插入元素x(入队操作)。操作成功,则返回TRUE,否则返回FALSE
int EnQueue(Queue *Q,ElemType x){
    if(IsFULL(Q))      //溢出处理
        return 0;
    Q->rear=(Q->rear+1)%Q->maxSize;
    Q->element[Q->rear]=x;
    return 1;
}
 
 
//出队.从队列Q中删除队头元素(出队操作)。操作成功,则返回TRUE,否则返回FALSE
int DeQueue(Queue *Q){
    if(IsEmpty(Q)){   //空队列处理
        return 0;
    }
    Q->front=(Q->front+1)%Q->maxSize;
    return 1;
}
 


//邻接表定义
typedef struct eNode{
	int adjVex;
	ElemType w;
	struct eNode* nextArc;
}ENode;
typedef struct lGraph{
	int n;
	int e;
	ENode **a;
}LGraph;

//初始化
typedef int Status;
Status Init(LGraph *lg,int nSize)
{
	int i;
	lg->n=nSize;
	lg->e=0;
	lg->a=(ENode**)malloc(nSize*sizeof(ENode*));
	if(!lg->a)
		return 0;
	else
	{
		for(i=0;i<lg->n;i++)	lg->a[i]=NULL;
		return 1;
	}
}

//邻接表的撤销
void Destory(LGraph *lg)
{
	int i;
	ENode *p,*q;
	for(i=0;i<lg->n;i++)
	{
		p=lg->a[i];
		q=p;
		while(p)		
		{
			p=p->nextArc;
			free(q);
			q=p;
		}
	}
	free(lg->a);
}

//边的搜索
Status Exist(LGraph *lg,int u,int v)
{
	ENode* p;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)
		return 0;
	p=lg->a[u];
	while(p&&p->adjVex!=v)	p=p->nextArc;
	if(!p)	return 0;
	else	return 1;
}

//边的插入
Status Insert(LGraph *lg,int u,int v,ElemType w)
{
	ENode *p;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)	return 0;
	if(Exist(lg,u,v))	return 5;
	p=(ENode *)malloc(sizeof(ENode));
	p->adjVex=v;
	p->w=w;
	p->nextArc=lg->a[u];
	lg->a[u]=p;
	lg->e++;
	return 1;
}

//边的删除
Status Remove(LGraph *lg,int u,int v)
{
	ENode *p,*q;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)
		return 0;
	p=lg->a[u];
	q=NULL;
	while(p&&p->adjVex!=v)
	{
		q=p;
		p=p->nextArc;
	}
	if(!p)	return 4;
	if(q)	q->nextArc=p->nextArc ;
	free(p);
	lg->e--;
	return 1;
}

//深度优先遍历
void DFS(int v,int visited[],LGraph g)
{
	ENode *w;
	printf("%d",v);
	visited[v]=1;
	for(w=g.a[v];w;w=w->nextArc)
		if(!visited[w->adjVex ])
			DFS(w->adjVex,visited,g);
}
void DFEGraph(LGraph g)
{
	int i;
	int *visited=(int*)malloc(g.n*sizeof(int));
	for(i=0;i<g.n;i++)
		visited[i]=0;
	for(i=0;i<g.n;i++)
		if(!visited[i])  DFS(i,visited,g);
	free(visited);
}

//宽度优先遍历
void BFS(int v,int visited[],LGraph g)
{
	ENode *w;
	Queue q;
	Create(&q,g.n);
	visited[v]=1;
	printf("%d",v);
	EnQueue(&q,v);
	while(!IsEmpty(&q))
	{
		Front(&q,&v);
		DeQueue(&q);
		for(w=g.a[v];w;w=w->nextArc)
			if(!visited[w->adjVex])
			{
				visited[w->adjVex]=1;
				printf("%d",w->adjVex);
				EnQueue(&q,w->adjVex);
			}
	}
}
void BFSGraph(LGraph g)
{
	int i;
	int *visited=(int *)malloc(g.n*sizeof(int));
	for(int i=0;i<g.n;i++)
		visited[i]=0;
	for(i=0;i<g.n;i++)
		if(!visited[i])	
			BFS(i,visited,g);
	free(visited);
}



//主函数
void main()
{
	int n;
	LGraph lg;
	printf("Please input the num of the node:");
	scanf("%d",&n);
	Init(&lg,n);
	printf("please input the num of the edge:");
	scanf("%d",&n);
	int u,v,w;
	for(int i=0;i<n;i++)
	{
		printf("Please input the edge:");
		scanf("%d%d%d",&u,&v,&w);
		Insert(&lg,u,v,w);
	}
	printf("DFS:");
	DFEGraph(lg);
	printf("\nBFS:");
	BFSGraph(lg);
	printf("\n");
	
}

实现智能交通的最佳选择

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

//邻接表定义
typedef struct eNode{
	int adjVex;
	ElemType w;
	struct eNode* nextArc;
}ENode;
typedef struct lGraph{
	int n;
	int e;
	ENode **a;
}LGraph;

//初始化
typedef int Status;
Status Init(LGraph *lg,int nSize)
{
	int i;
	lg->n=nSize;
	lg->e=0;
	lg->a=(ENode**)malloc(nSize*sizeof(ENode*));
	if(!lg->a)
		return 0;
	else
	{
		for(i=0;i<lg->n;i++)	lg->a[i]=NULL;
		return 1;
	}
}

//邻接表的撤销
void Destory(LGraph *lg)
{
	int i;
	ENode *p,*q;
	for(i=0;i<lg->n;i++)
	{
		p=lg->a[i];
		q=p;
		while(p)		
		{
			p=p->nextArc;
			free(q);
			q=p;
		}
	}
	free(lg->a);
}

//边的搜索
Status Exist(LGraph *lg,int u,int v)
{
	ENode* p;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)
		return 0;
	p=lg->a[u];
	while(p&&p->adjVex!=v)	p=p->nextArc;
	if(!p)	return 0;
	else	return 1;
}

//边的插入
Status Insert(LGraph *lg,int u,int v,ElemType w)
{
	ENode *p;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)	return 0;
	if(Exist(lg,u,v))	return 5;
	p=(ENode *)malloc(sizeof(ENode));
	p->adjVex=v;
	p->w=w;
	p->nextArc=lg->a[u];
	lg->a[u]=p;
	lg->e++;
	return 1;
}

//边的删除
Status Remove(LGraph *lg,int u,int v)
{
	ENode *p,*q;
	if(u<0||v<0||u>lg->n-1||v>lg->n-1||u==v)
		return 0;
	p=lg->a[u];
	q=NULL;
	while(p&&p->adjVex!=v)
	{
		q=p;
		p=p->nextArc;
	}
	if(!p)	return 4;
	if(q)	q->nextArc=p->nextArc ;
	free(p);
	lg->e--;
	return 1;
}

//智能交通
void ITS(int o,int d,int j,int *B,int r[],int b[],int W[],int (*R)[50],LGraph g)
{
	ENode *w;
	r[j]=o;
	j++;
	for(w=g.a[o];w;w=w->nextArc)
	{
		if(w->adjVex==d)
		{
			W[j-1]=w->w;
			r[j]=w->adjVex;
			int sum=0;
			int i=0;
			for(i=0;i<j;i++)
			{
				sum+=W[i];
				R[*B][i]=r[i];
			}
			R[*B][i]=r[i];
			b[*B]=sum;
			
			*B+=1;
			continue;
		}
		int	i=0;
		int judge=1;
		while(r[i]!=0)
		{
			if(r[i]==w->adjVex)
				judge=0;
			i++;
		}
		if(judge)
		{
			W[j-1]=w->w;
			ITS(w->adjVex,d,j,B,r,b,W,R,g);
		}
		
	}
}
void ITSGraph(LGraph g)
{
	int i;

	int *route=(int*)malloc(g.n*g.n*sizeof(int));//记录路径
	for(i=0;i<g.n;i++)
		route[i]=-1;
	
	int *best=(int*)malloc(g.n*sizeof(int));
	for(i=0;i<g.n;i++)
		best[i]=0;

	int *W=(int*)malloc(g.n*sizeof(int));
	for(i=0;i<g.n;i++)
		W[i]=0;

	int R[50][50];
	for(int i=0;i<50;i++)
		for(int j=0;j<50;j++)
			R[i][j]=-1;

	int o,d;
	printf("please input the origin and destination:");
	scanf("%d%d",&o,&d);

	int B=0;
	ITS(o,d,0,&B,route,best,W,R,g);

	int temp=best[0];
    for(int i=1;i<B;i++)
	{
		if(temp>best[i])
			temp=best[i];
	}
	printf("the best way is:\n");
	for(int i=0;i<B;i++)
	{
		if(temp==best[i])
		{
			int p=0;
			while(R[i][p]!=-1)
			{
				printf("%d",R[i][p]);
				p++;
				if(R[i][p]!=-1)
					printf("->");
			}
			printf("\n");
		}
		
	}
	printf("cost:%d\n",temp);
	free(W);
	free(best);
	free(route);
}



//主函数
void main()
{
	int n;
	LGraph lg;
	//printf("Please input the num of the node:");
//	scanf("%d",&n);
	Init(&lg,6);
	/*printf("please input the num of the edge:");
	scanf("%d",&n);
	int u,v,w;
	for(int i=0;i<n;i++)
	{
		printf("Please input the edge:");
		scanf("%d%d%d",&u,&v,&w);
		Insert(&lg,u,v,w);
	}*/
	int w=1;
	Insert(&lg,1,3,w);
	Insert(&lg,1,2,w);
	Insert(&lg,0,1,w);
	Insert(&lg,3,2,w);
	Insert(&lg,3,0,w);
	Insert(&lg,2,0,w);
	Insert(&lg,5,1,w);
	Insert(&lg,5,3,w);
    Insert(&lg,4,0,w);
	Insert(&lg,4,2,w);
	ITSGraph(lg);
}\

标签:lg,mg,return,运算,int,路径,智能,printf,visited
来源: https://blog.csdn.net/Y_peak/article/details/116710381