源代码如下 c语言

先抛开输入输出格式,因联通与非联通会有不同的输出格式,采用非递归(栈)进行图的遍历是本题主体
#include<stdio.h>
#include<stdlib.h>
#define max 1005//增大
#define overflow -1
#define ERROR -1
typedef struct ArcNode{
   int adjvex;
   struct ArcNode * nextarc;
}ArcNode;

typedef struct VNode{
  int cur;
  ArcNode * firstarc;
}VNode,AdjList[max];

typedef struct{
  AdjList vertices;
  int vexnum,arcnum;
}ALGraph;
typedef struct{
  int * base;
  int * top;
}SqStack;
void InitStack(SqStack * S){
  (*S).base = (int *)malloc(sizeof(int)*max);
  if(!(*S).base)  exit(overflow);
  (*S).top = (*S).base;
}

void Push(SqStack * S,int e){
  *((*S).top++) = e;
}

int Pop(SqStack * S){
  int e;
  if((*S).base == (*S).top)
     return ERROR;
  e = *--(*S).top;
  return e;
}
int GetTop(SqStack  S){
  int e;
  e = *(--S.top);
  return e;
}
int DFSTraverse(int e,SqStack *S,ALGraph G,int visited[]){
      int i,j;
      ArcNode * w;
      Push(S,e);
      printf("%d ",e);
      visited[e] = 1;
      while((*S).base != (*S).top){
         i = GetTop(*S);
         w = G.vertices[i].firstarc;
         while(w!=NULL && visited[w->adjvex]==1)  w = w->nextarc;
         if(w == NULL){
            Pop(S);
            j = GetTop(*S);
            if((*S).top-(*S).base >1){     
               printf("%d ",j);            
            }
            if((*S).top-(*S).base == 1)
               printf("%d",j);
         }
         else if(visited[w->adjvex] == 0){
            Push(S,w->adjvex);
            printf("%d ",w->adjvex);
            visited[w->adjvex] = 1;     
         }
      }    
      return 1;
}

int main(){
  ALGraph G;
  SqStack S;
  InitStack(&S);
  int M,N,i,p,q,start,flag=1;
  int visited[max]={0};
  ArcNode * r,* t,*w;
  scanf("%d %d",&N,&M);
  scanf("%d",&start);
  G.arcnum = M; 
  G.vexnum = N;
  for(i=1;i<=N;i++){
    G.vertices[i].cur = i;
    G.vertices[i].firstarc = NULL;
  }
  while(M--){
    scanf("%d %d",&p,&q);
    r = (ArcNode *)malloc(sizeof(ArcNode));
    t = (ArcNode *)malloc(sizeof(ArcNode));
    w = (ArcNode *)malloc(sizeof(ArcNode));
    r->adjvex = p; r->nextarc = NULL;
    t->adjvex = q; t->nextarc = NULL;
    if(!G.vertices[q].firstarc){
       G.vertices[q].firstarc = r;
    }
    else{
      w = G.vertices[q].firstarc;
      if(w->adjvex >= p){
         G.vertices[q].firstarc = r;
         r->nextarc =w;
      }
      else{//q的first比p小,p需要在后面找合适位置
         if(!w->nextarc){
             w->nextarc = r;
         }
         else{
           while(w->nextarc){
              if((w->nextarc)->adjvex >= p)
                break;
              w = w->nextarc;
           }//while
           r->nextarc = w->nextarc;
           w->nextarc =r;
         }//else
      }//else
    }//else

if(!G.vertices[p].firstarc){
       G.vertices[p].firstarc = t;
    }
    else{
      w = G.vertices[p].firstarc;
      if(w->adjvex >= q){
         G.vertices[p].firstarc = t;
         t->nextarc =w;
      }
      else{
         if(!w->nextarc){
             w->nextarc = t;
         }
         else{
           while(w->nextarc){
              if((w->nextarc)->adjvex >= q)
                break;
              w = w->nextarc;
           }//while
           t->nextarc = w->nextarc;
           w->nextarc =t;
         }//else
      }//else
    }//else

}//while
 DFSTraverse(start,&S,G,visited);
 for(i=1;i<=G.vexnum;i++){
    if(!visited[i]){
       printf(" 0\n");
       break;    
    }
 }
 if(i>G.vexnum)
   printf("\n");
return 0;

}

PTA 地下迷宫探索相关推荐

  1. pta 地下迷宫探索

    5-5 地下迷宫探索   (30分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战 ...

  2. PTA 地下迷宫探索(图的遍历dfs)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  3. pta地下迷宫探索(详解)

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  4. PTA 6-7-1 地下迷宫探索

    6-7-1 地下迷宫探索 (30分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战 ...

  5. 数据结构PTA 案例6-1.4 地下迷宫探索

    案例6-1.4 地下迷宫探索 题目 解法 题目 假设有一个地下通道迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关.请问你如何从某个起点开始在迷宫中点亮所有的灯并回到起 ...

  6. 7-33 地下迷宫探索 (30 分)(思路加详解)

    一:题目 7-33 地下迷宫探索 (30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰 ...

  7. 7-2 地下迷宫探索 (30 分)(C语言实现)

    7-2 地下迷宫探索 (30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争 ...

  8. 7-9 地下迷宫探索 (8 分)

    7-9 地下迷宫探索 (8 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生 ...

  9. 7-2 地下迷宫探索

    7-2 地下迷宫探索 分数 30 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村 ...

最新文章

  1. 点击展开 表格_Excel里面如何设置默认的表格和透视表样式
  2. 生物信息学搞计算机,生物信息学前景展望,谈谈感想(已经停止)
  3. 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
  4. 非IT人士的云栖酱油之行 (程序猿迷妹的云栖之行)
  5. php程序控制结构,PHP 控制结构
  6. RMI 异常 no security manager: RMI class loader disabled
  7. 波士顿动力机器狗解锁“自动驾驶”,会跑步的Atlas真的很稳
  8. 批量增加域用户并设置为漫游用户
  9. [SQL Server] Access和SQL Server的数据迁移
  10. mysql将日期转换年份_mysql将日期转换为当前年份的相同日期
  11. 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...
  12. python图片对比模块_使用Python的PIL模块来进行图片对比
  13. 景联文科技为自动驾驶DMS系统提供数据采集标注服务
  14. 关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用
  15. StringBuilder
  16. 与器材无关 简单几步解决单反出片灰蒙蒙问题
  17. [leetcode]322. 零钱兑换(Coin Change )C++代码实现
  18. URL中的20%、22%、26%、7B%、%7D、28%、29%解析成真实的字符
  19. 汇付国际为跨境电商赋能:做合规的跨境支付平台!
  20. 题目名称:组个最小数时间限制:1000ms内存限制:256MB提交通过率:43%

热门文章

  1. 数控直流稳压电源设计方案
  2. TechBits | TCP 使用 WireShark 进行抓包
  3. 大班幼儿告状行为与教师教育态度和方法的研究
  4. 从表格读取数据的自动化模板
  5. 大学计算机结课论文怎么写,大学本科计算机论文格式_大学本科计算机毕业论文范文...
  6. SQL中将两个日期进行相减得到分钟或者秒
  7. 基于GPT2实现中文新闻文本分类任务
  8. swagger:快速入门
  9. PotPlayer字幕实时翻译扩展插件
  10. 阅读图像显著性检测论文五:2011年版本的Global Contrast Based Salient Region Detection