第十二周项目4——利用遍历思想求解图问题(1)(2)

来源:互联网 发布:javascriptcore源码 编辑:程序博客网 时间:2024/05/21 09:10
  1. /*      
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院      
  3. * All rights reserved.      
  4. * 文件名称:wu.cpp      
  5. * 作    者:武昊      
  6. * 完成日期:2016年11月24日      
  7. * 版 本 号:v1.0       
  8. *问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题的处理方法。  
  9.   (1)设计一个算法,判断顶点u到v是否有简单路径  
  10.   (2)设计一个算法输出图G中从顶点u到v的一条简单路径(设计测试图时,保证图G中从顶点u到v至少有一条简单路径)。  
  11.   (3)输出从顶点u到v的所有简单路径。  
  12.   (4)输出图G中从顶点u到v的长度为s的所有简单路径。  
  13.   (5)求图中通过某顶点k的所有简单回路(若存在)     
  14. *输入描述:无      
  15. *程序输出:测试数据      
  16. */
测试图结构及存储:

1、是否有简单路径? 
问题:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径。
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "graph.h"  
  4. int visited[MAXV];     //定义存放节点的访问标志的全局数组  
  5. void ExistPath(ALGraph *G,int u,int v, bool &has)  
  6. {  
  7.     int w;  
  8.     ArcNode *p;  
  9.     visited[u]=1;  
  10.     if(u==v)  
  11.     {  
  12.         has=true;  
  13.         return;  
  14.     }  
  15.     p=G->adjlist[u].firstarc;  
  16.     while (p!=NULL)  
  17.     {  
  18.         w=p->adjvex;  
  19.         if (visited[w]==0)  
  20.             ExistPath(G,w,v,has);  
  21.         p=p->nextarc;  
  22.     }  
  23. }  
  24.   
  25. void HasPath(ALGraph *G,int u,int v)  
  26. {  
  27.     int i;  
  28.     bool flag = false;  
  29.     for (i=0; i<G->n; i++)  
  30.         visited[i]=0; //访问标志数组初始化  
  31.     ExistPath(G,u,v,flag);  
  32.     printf(" 从 %d 到 %d ", u, v);  
  33.     if(flag)  
  34.         printf("有简单路径\n");  
  35.     else  
  36.         printf("无简单路径\n");  
  37. }  
  38.   
  39. int main()  
  40. {  
  41.     ALGraph *G;  
  42.     int A[5][5]=  
  43.     {  
  44.         {0,0,0,0,0},  
  45.         {0,0,1,0,0},  
  46.         {0,0,0,1,1},  
  47.         {0,0,0,0,0},  
  48.         {1,0,0,1,0},  
  49.     };  //请画出对应的有向图  
  50.     ArrayToList(A[0], 5, G);  
  51.     HasPath(G, 1, 0);  
  52.     HasPath(G, 4, 1);  
  53.     return 0;  
  54. }  


2、输出简单路径 
问题:假设图G采用邻接表存储,设计一个算法输出图G中从顶点u到v的一条简单路径(假设图G中从顶点u到v至少有一条简单路径)。
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "graph.h"  
  4. int visited[MAXV];     //定义存放节点的访问标志的全局数组  
  5. void FindAPath(ALGraph *G,int u,int v,int path[],int d)  
  6. {  
  7.     //d表示path中的路径长度,初始为-1  
  8.     int w,i;  
  9.     ArcNode *p;  
  10.     visited[u]=1;  
  11.     d++;  
  12.     path[d]=u;  //路径长度d增1,顶点u加入到路径中  
  13.     if (u==v)   //找到一条路径后输出并返回  
  14.     {  
  15.         printf("一条简单路径为:");  
  16.         for (i=0; i<=d; i++)  
  17.             printf("%d ",path[i]);  
  18.         printf("\n");  
  19.         return;         //找到一条路径后返回  
  20.     }  
  21.     p=G->adjlist[u].firstarc;  //p指向顶点u的第一个相邻点  
  22.     while (p!=NULL)  
  23.     {  
  24.         w=p->adjvex;    //相邻点的编号为w  
  25.         if (visited[w]==0)  
  26.             FindAPath(G,w,v,path,d);  
  27.         p=p->nextarc;   //p指向顶点u的下一个相邻点  
  28.     }  
  29. }  
  30.   
  31. void APath(ALGraph *G,int u,int v)  
  32. {  
  33.     int i;  
  34.     int path[MAXV];  
  35.     for (i=0; i<G->n; i++)  
  36.         visited[i]=0; //访问标志数组初始化  
  37.     FindAPath(G,u,v,path,-1);  //d初值为-1,调用时d++,即变成了0  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.   
  43.     ALGraph *G;  
  44.     int A[5][5]=  
  45.     {  
  46.         {0,0,0,0,0},  
  47.         {0,0,1,0,0},  
  48.         {0,0,0,1,1},  
  49.         {0,0,0,0,0},  
  50.         {1,0,0,1,0},  
  51.     };  //请画出对应的有向图  
  52.     ArrayToList(A[0], 5, G);  
  53.     APath(G, 1, 0);  
  54.     APath(G, 4, 1);  
  55.     return 0;  
  56. }

0 0
原创粉丝点击