第十章第十六题 POWERBY KTL

原创 2006年06月09日 01:32:00

//16.利用图的深度优先搜索和广度优先搜索各写一个算法,
//辨别以邻接表方式表示的有向图中是否存在由顶点Vi到顶点Vj的路径(i!=j).
//深度优先(第一个函数Route)
//广度优先(第二个函数Route,需要去调注释同时把深度优先函数注释掉;
//程序输入,参考书本P225页图10-6
//输入顶点信息为1234(回车);
//输入边数为4;
//输入第一边:1 2
//输入第二边:1 3
//输入第三边:3 4
//输入第四边:4 1
//按#结束测试程序;
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"

#define n 4
typedef char vextype;
typedef struct node1   //由于与队列结点定义发生冲突,因此改为node1;
{
 int adjvex;
 struct node1 *pNext;
}edgenode;
typedef struct
{
 vextype vertex;
 edgenode *link;
}vexnode;

vexnode ga[n];
int visited[n]={0};

void CreatList(vexnode ga[])
{
 int i,j,k,e,h;
 edgenode *s;
 printf("请输入顶点信息:");
 for(i=0;i<n;i++)
 {
  ga[i].vertex=getchar();
  ga[i].link=NULL;
 }
 printf("请输入有向边的数目:");
 scanf("%d",&e);
 h=1;
 for(k=0;k<e;k++)
 {
  printf("请输入第%d个边的i,j:",h++);
  scanf("%d %d",&i,&j);
  s=(edgenode*)malloc(sizeof(edgenode));
  s->adjvex=j;
  s->pNext=ga[i].link;
  ga[i].link=s;
 }
 return;
}

int flag=0;//标志为全局变量

//以下函数为按深度优先判断是否存在路径(注意下面的注释)
///*
void Route(int i,int j)
{
 edgenode *p;
 if(i==j)
 {
  flag=1;
  return;
 }
 visited[i]=1;
 p=ga[i].link;
 while(p!=NULL)
 {
  if(visited[p->adjvex]==0)
   Route(p->adjvex,j);
  p=p->pNext;
 }
 return;
}
//*/
//以下函数为按广度优先判断是否存在路径;
//附队列程序  把注释去掉即可调用广度优先判断是否存在路径;
/*

typedef char datatype;

typedef struct node2
{
 datatype data;
 struct node2 * pNext;
}linklist;

typedef struct
{
 linklist *front,*rear;
}linkqueue;

void SETNULLQL(linkqueue *q)
{
 q->front=(linklist*)malloc(sizeof(linklist));
 q->front->pNext=NULL;
 q->rear=q->front;
}//置空队

bool EMPTYQL(linkqueue*q)
{
 if(q->front==q->rear)
  return true;
 else return false;
}//判断队空

datatype FRONTQL(linkqueue*q)
{
 if(EMPTYQL(q))
 {
  printf("队空");
  return -1;
 }
 else return(q->front->pNext->data);
}//取队头元素

void ENQUEUEQL(linkqueue *q,datatype x)
{
 q->rear->pNext=(linklist *)malloc(sizeof(linklist));
 q->rear=q->rear->pNext;
 q->rear->data=x;
 q->rear->pNext=NULL;
}//入队

datatype DEQUEUEQL(linkqueue*q)
{
 datatype temp;
 linklist * s;
 if(EMPTYQL(q))
 {
  printf("队空");
  return -1;
 }
 else{
  s=q->front->pNext;
  if(s->pNext==NULL)
  {
   q->front->pNext=NULL;
   q->rear=q->front;
  }
  else q->front->pNext=s->pNext;
  temp=s->data;
  free(s);
  return(temp);
 }
}//删除队头元素并返回队头元素

void Route(int i,int j)
{
 int k;
 edgenode *p;
 linkqueue *Q;
 Q=(linkqueue*)malloc(sizeof(linkqueue));
 SETNULLQL(Q);
 if(i==j){
  flag=1;
  return;
 }
 visited[i]=1;
 ENQUEUEQL(Q,i);
 while(!EMPTYQL(Q))
 {
  k=DEQUEUEQL(Q);
  p=ga[k].link;
  while(p!=NULL)
  {
   if(visited[p->adjvex]!=1)
   {
    if(p->adjvex==j){    //与深度优先不同,关键这里要用的是p->adjvex==j;
     flag=1;
     return;
    }
    visited[p->adjvex]=1;
    ENQUEUEQL(Q,p->adjvex);
   }
   p=p->pNext;
  }
 }
}

*/
int main()
{
 char ch;
 int i,j,k;
 printf("本程序为测试i到j是否有路径.../n");
 CreatList(ga);
 while(ch!='#')
 {
  printf("请输入要测试的顶点Vi与Vj的下标:");
  scanf("%d %d",&i,&j);
  Route(i,j);
  if(flag)
   printf("存在路径.../n");
  else
   printf("不存在路径.../n");
  printf("如果退出请输入#...按任意键继续.../n");
  ch=getch();
  flag=0;
  for(k=0;k<n;k++)
   visited[k]=0;
 }
 return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

微软等数据结构与算法面试100题 第十六题

第十六题 题目: 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 分析: 这道题主要考察的是二叉树的广度优先周游,比较简单。就是使用队列(que...

【100题】第十六题(层序打印树的节点)

一,题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入        8      /    \     6  ...

第十六题(接口)

2015年“甲骨文杯”全国Java程序设计大赛-赛前模拟

c++primer第十章课后编程题

#ifndef HEAD2_H_ #define HEAD2_H_ class Person { private: static const int LIMIT=25; std::string ...
  • erpng
  • erpng
  • 2014-05-15 08:54
  • 322

《C++ Primer Plus(第六版)》(17)(第十章 对象和类 编程题答案)

10.10编程题 1. Test.h #ifndef _Test_H_ #define _Test_H_ #include #include using namespace std; cl...

CCNA第十章检测题

1 What are two common methods for setting a UTP Ethernet port to MDI or MDIX operation? (Choose two....

【java语言程序设计基础篇第十章第三题】

package OctTTYwo;public class MyInteger { int value ; String valuel; public MyInteger...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)