图的基本运算及智能交通中的最佳路径选择问题
作者:互联网
图的基本运算及智能交通中的最佳路径选择问题
完成邻接矩阵的初始化、撤销和边的搜索、插入、删除等操作
#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