鱼C论坛

 找回密码
 立即注册
查看: 3690|回复: 2

关于图的简单路径和最短路径

[复制链接]
发表于 2016-12-10 15:23:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<string.h>
  4. #define MAXV 100                        //最大顶点个数
  5. #define INF 32767                        //INF表示无穷大
  6. typedef struct{
  7.         int no;                                        //顶点编号
  8.         int info;                                //顶点的其他信息
  9.         char name[60];                       
  10. }VertexType;                                //顶点类型

  11. typedef struct{                                //图的定义
  12.         int edges[MAXV][MAXV];        //邻接矩阵
  13.         int n,e;                                //顶点数,边数
  14.         VertexType vexs[MAXV];        //存放顶点信息
  15. }MGraph;
  16. //以下定义邻接表类型
  17. typedef struct ANode                   //边的节点结构类型
  18. {        int adjvex;                      //该边的终点位置
  19. struct ANode *nextarc;                 //指向下一条边的指针
  20. int info;                                  //该边的相关信息,这里用于存放权值
  21. } ArcNode;

  22. typedef struct Vnode                      //邻接表头结点的类型
  23. {        int data;                                        //顶点信息
  24. char name[60];
  25. ArcNode *firstarc;                     //指向第一条弧
  26. } VNode;

  27. typedef VNode AdjList[MAXV];        //AdjList是邻接表类型
  28. typedef struct
  29. {        AdjList adjlist;                 //邻接表
  30. int n,e;                         //图中顶点数n和边数e
  31. } ALGraph;                           //图的邻接表类型
  32. int visited[MAXV];
  33. //********************************************************
  34. //********************************************************
  35. void MatToList(MGraph g,ALGraph *&G)        //将邻接矩阵g转换成邻接表G
  36. {
  37.         int i,j;                                                        //n为顶点数
  38.         ArcNode *p;
  39.         G=(ALGraph *)malloc(sizeof(ALGraph));
  40.         for (i=0;i<g.n;i++)                                        //给邻接表中所有头结点的指针域置初值
  41.                 G->adjlist[i].firstarc=NULL;
  42.         for (i=0;i<g.n;i++)                                        //检查邻接矩阵中每个元素
  43.                 for (j=g.n-1;j>=0;j--)
  44.                         if (g.edges[i][j]!=0 && g.edges[i][j]!=INF)                                //邻接矩阵的当前元素不为0
  45.                         {   
  46.                                 p=(ArcNode *)malloc(sizeof(ArcNode));        //创建一个结点*p
  47.                                 p->adjvex=j;
  48.                                 p->info=g.edges[i][j];
  49.                                 p->nextarc=G->adjlist[i].firstarc;                //将*p链到链表后
  50.                                 G->adjlist[i].firstarc=p;
  51.                         }
  52.                         for(i=0;i<g.n;i++)
  53.                                 strcpy(G->adjlist[i].name,g.vexs[i].name);
  54.                         G->n=g.n;G->e=g.e;
  55. }

  56. void DispAdj(ALGraph *G)                //输出邻接表G
  57. {
  58.         int i;
  59.         ArcNode *p;
  60.         for (i=0;i<G->n;i++)
  61.         {
  62.                 p=G->adjlist[i].firstarc;
  63.                 printf("%3d: ",i);
  64.                 while (p!=NULL)
  65.                 {
  66.                         printf("%3d(%d)",p->adjvex,p->info);
  67.                         p=p->nextarc;
  68.                 }
  69.                 printf("\n");
  70.         }
  71. }

  72. void FindPath(ALGraph *G,int u,int v,int path[],int d)//G用邻接表存储,输出图G从顶点u到v的所有简单路径
  73. {        //d表示path中的路径长度,初始为-1;
  74.         int w,i;
  75.         ArcNode *p;
  76.         d++;path[d]=u;                //路径长度d增1,顶点u加入到数组path中
  77.         visited[u]=1;                //置顶点u已经访问
  78.         if(u==v && d>=1)//找到一条简单路径就输出存储顶点的数组path
  79.         {                               
  80.                 for(i=0;i<d;i++)
  81.                 {
  82.                         printf("%2s→",G->adjlist[path[i]].name);
  83.                 }
  84.                 printf("%2s",G->adjlist[path[i]].name);
  85.                 printf("\n");   
  86.         }
  87.                 p=G->adjlist[u].firstarc;        //p指向顶点u的第一个相邻点
  88.                 while(p!=NULL)
  89.                 {
  90.                         w=p->adjvex;                        //w为顶点u的相邻顶点
  91.                         if(visited[w]==0){                //若顶点w未访问,递归访问它
  92.                                 FindPath(G,w,v,path,d);
  93.                         }
  94.                         p=p->nextarc;                //p指向顶点u的下一个相邻点
  95.                 }
  96.                 visited[u]=0;                //恢复环境,使该顶点可重新使用
  97. }
  98. void main(){
  99.         int path[MAXV],u=1,v=4,d=-1;
  100.         int i,j;
  101.         MGraph g;
  102.         ALGraph *G;
  103.         g.n=5;
  104.         g.e=8;
  105.         int A[MAXV][MAXV]={
  106.                 {0,3,0,5,4},{3,0,5,4,0},{0,5,0,2,1},
  107.                 {5,4,2,0,1},{4,0,1,1,0}};
  108.                 for(i=0;i<g.n;i++)
  109.                         for(j=0;j<g.n;j++)
  110.                                 g.edges[i][j]=A[i][j];
  111.                         for(i=0;i<g.n;i++)
  112.                                 g.vexs[i].no=i;
  113.                         strcpy(g.vexs[0].name,"正门");
  114.                         strcpy(g.vexs[1].name,"教学楼");
  115.                         strcpy(g.vexs[2].name,"英东楼");
  116.                         strcpy(g.vexs[3].name,"学生宿舍");
  117.                         strcpy(g.vexs[4].name,"艺术学院");                               
  118.                         MatToList(g,G);
  119.                         for(i=0;i<g.n;i++)
  120.                                 visited[i]=0;
  121.                         DispAdj(G);
  122.                         FindPath(G,u,v,path,d);
  123. }
复制代码


我这是带权无向图,我想在简单的路径后面把边的权值和算出来,但老不错,求各位大神!
还有 关于最短路径的求法,到底需要怎么求?小甲鱼的视频看不懂不会用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-10 15:23:38 | 显示全部楼层
有人吗?求救
我这是带权无向图,我想在简单的路径后面把边的权值和算出来,但老不错,求各位大神!
还有 关于最短路径的求法,到底需要怎么求?小甲鱼的视频看不懂不会用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-5 09:40:29 | 显示全部楼层
参考我的“带权重的最优路径解法”的帖子吧
http://bbs.fishc.com/thread-81073-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 05:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表