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

来源:互联网 发布:java模板 编辑:程序博客网 时间:2024/06/11 12:27
  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. */ 
3、输出所有路径 

问题:输出从顶点u到v的所有简单路径。


  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "graph.h"  
  4. int visited[MAXV];     //定义存放节点的访问标志的全局数组  
  5. void FindPaths(ALGraph *G,int u,int v,int path[],int d)  
  6. //d是到当前为止已走过的路径长度,调用时初值为-1  
  7. {  
  8.     int w,i;  
  9.     ArcNode *p;  
  10.     visited[u]=1;  
  11.     d++;            //路径长度增1  
  12.     path[d]=u;              //将当前顶点添加到路径中  
  13.     if (u==v && d>1)            //输出一条路径  
  14.     {  
  15.         printf("  ");  
  16.         for (i=0; i<=d; i++)  
  17.             printf("%d ",path[i]);  
  18.         printf("\n");  
  19.     }  
  20.     p=G->adjlist[u].firstarc; //p指向u的第一条边  
  21.     while(p!=NULL)  
  22.     {  
  23.         w=p->adjvex;     //w为u的邻接顶点  
  24.         if (visited[w]==0)      //若顶点未标记访问,则递归访问之  
  25.             FindPaths(G,w,v,path,d);  
  26.         p=p->nextarc; //找u的下一个邻接顶点  
  27.     }  
  28.     visited[u]=0;   //恢复环境  
  29. }  
  30.   
  31.   
  32. void DispPaths(ALGraph *G,int u,int v)  
  33. {  
  34.     int i;  
  35.     int path[MAXV];  
  36.     for (i=0; i<G->n; i++)  
  37.         visited[i]=0; //访问标志数组初始化  
  38.     printf("从%d到%d的所有路径:\n",u,v);  
  39.     FindPaths(G,u,v,path,-1);  
  40.     printf("\n");  
  41. }  
  42.   
  43. int main()  
  44. {  
  45.     ALGraph *G;  
  46.     int A[5][5]=  
  47.     {  
  48.         {0,1,0,1,0},  
  49.         {1,0,1,0,0},  
  50.         {0,1,0,1,1},  
  51.         {1,0,1,0,1},  
  52.         {0,0,1,1,0}  
  53.     };  //请画出对应的有向图  
  54.     ArrayToList(A[0], 5, G);  
  55.     DispPaths(G, 1, 4);  
  56.     return 0;  
  57. }  

4、输出一些简单回路 
问题:输出图G中从顶点u到v的长度为s的所有简单路径。


  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "graph.h"  
  4. int visited[MAXV];     //定义存放节点的访问标志的全局数组  
  5. void SomePaths(ALGraph *G,int u,int v,int s, int path[],int d)  
  6. //d是到当前为止已走过的路径长度,调用时初值为-1  
  7. {  
  8.     int w,i;  
  9.     ArcNode *p;  
  10.     visited[u]=1;  
  11.     d++;            //路径长度增1  
  12.     path[d]=u;              //将当前顶点添加到路径中  
  13.     if (u==v && d==s)           //输出一条路径  
  14.     {  
  15.         printf("  ");  
  16.         for (i=0; i<=d; i++)  
  17.             printf("%d ",path[i]);  
  18.         printf("\n");  
  19.     }  
  20.     p=G->adjlist[u].firstarc; //p指向u的第一条边  
  21.     while(p!=NULL)  
  22.     {  
  23.         w=p->adjvex;     //w为u的邻接顶点  
  24.         if (visited[w]==0)      //若顶点未标记访问,则递归访问之  
  25.             SomePaths(G,w,v,s,path,d);  
  26.         p=p->nextarc; //找u的下一个邻接顶点  
  27.     }  
  28.     visited[u]=0;   //恢复环境  
  29. }  
  30.   
  31. void DispSomePaths(ALGraph *G,int u,int v, int s)  
  32. {  
  33.     int i;  
  34.     int path[MAXV];  
  35.     for (i=0; i<G->n; i++)  
  36.         visited[i]=0; //访问标志数组初始化  
  37.     printf("从%d到%d长为%d的路径:\n",u,v,s);  
  38.     SomePaths(G,u,v,s,path,-1);  
  39.     printf("\n");  
  40. }  
  41.   
  42. int main()  
  43. {  
  44.     ALGraph *G;  
  45.     int A[5][5]=  
  46.     {  
  47.         {0,1,0,1,0},  
  48.         {1,0,1,0,0},  
  49.         {0,1,0,1,1},  
  50.         {1,0,1,0,1},  
  51.         {0,0,1,1,0}  
  52.     };  //请画出对应的有向图  
  53.     ArrayToList(A[0], 5, G);  
  54.     DispSomePaths(G, 1, 4, 3);  
  55.     return 0;  

0 0
原创粉丝点击