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

来源:互联网 发布:计算机四级有用吗 知乎 编辑:程序博客网 时间:2024/04/30 13:28

/* 
 *Copyright(c) 2015, 烟台大学计算机学院 
 *All rights reserved. 
 *文件名称:利用遍历思想求解图问题(1).cpp 
 *作    者:周洁 
 *完成日期:2015年 11月23日 
 *版 本 号: 
 * 

 *问题描述:假设图G采用邻接表存储,设计一个算法,判断顶点u到v是否有简单路径

 *输入描述:若干数据

 *输出描述:判断是否有简单路径

*/

 

代码:

(1)头文件:图基本算法库

(2)源文件:

#include <stdio.h>#include <malloc.h>#include "graph.h"int visited[MAXV];     //定义存放节点的访问标志的全局数组void ArrayToList(int *Arr, int n, ALGraph *&G)  {      int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数      ArcNode *p;      G=(ALGraph *)malloc(sizeof(ALGraph));      G->n=n;      for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值          G->adjlist[i].firstarc=NULL;      for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素          for (j=n-1; j>=0; j--)              if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]              {                  p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p                  p->adjvex=j;                  p->info=Arr[i*n+j];                  p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p                  G->adjlist[i].firstarc=p;              }       G->e=count;  }  void ExistPath(ALGraph *G,int u,int v, bool &has){    int w;    ArcNode *p;    visited[u]=1;    if(u==v)    {        has=true;        return;    }    p=G->adjlist[u].firstarc;    while (p!=NULL)    {        w=p->adjvex;        if (visited[w]==0)            ExistPath(G,w,v,has);        p=p->nextarc;    }}void HasPath(ALGraph *G,int u,int v){    int i;    bool flag = false;    for (i=0; i<G->n; i++)        visited[i]=0; //访问标志数组初始化    ExistPath(G,u,v,flag);    printf(" 从 %d 到 %d ", u, v);    if(flag)        printf("有简单路径\n");    else        printf("无简单路径\n");}int main(){    ALGraph *G;    int A[5][5]=    {        {0,0,0,0,0},        {0,0,1,0,0},        {0,0,0,1,1},        {0,0,0,0,0},        {1,0,0,1,0},    };  //请画出对应的有向图    ArrayToList(A[0], 5, G);    HasPath(G, 1, 0);    HasPath(G, 4, 1);    return 0;}


运行结果:

 

知识点总结:

图遍历思想的应用

0 0