源代码如下 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. 关于选择博客网站的一点看法
  2. arthas命令使用示例:watch
  3. java8 javafx_Java 8的新增功能(第1部分– JavaFX)
  4. Linux系统编程8-18总结项目:完成一个简单的自己的shell
  5. Linux已经霸占了服务器领域
  6. python爬虫新浪新闻_学习了《python网络爬虫实战》第一个爬虫,爬取新浪新闻
  7. icmp协议_CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了
  8. 商品预约抢购实践及redis性能测试
  9. java的三国游戏 可以招降,招募武将类游戏,三国能选5个武将带兵游戏
  10. 如何使用浏览器网络监视工具进行黑客攻击
  11. 测试显卡好坏的软件叫什么关系,#现在测显卡好坏,有无暗病,都用什么软件#显卡压力测试 甜甜圈...
  12. 浮动时间怎么计算_自由浮动时间 VS 总浮动时间
  13. Sourcetree下载-使用-快速入门
  14. 微信小程序input只允许输入数字
  15. linux 蓝牙驱动
  16. Struts2远程命令执行漏洞
  17. js怎么获取扫码枪条码_JS 如何获取扫码枪输入数据
  18. DM数据库配置开机自启动
  19. 微淼联合创始人孙延芳:以合规为第一要义,做财商教育“正规军”
  20. 怎么修改PDF文字,PDF修改文字用什么方法

热门文章

  1. 无人机——电机篇(一)
  2. 主流深度相机选型(双目相机)
  3. cadence导出bom清单_OrCAD Capture CIS 16.6 导出BOM
  4. Attention Mechanisms in Computer Vision: A Survey综述详解
  5. 如何不通过网络把电脑上的视频上传到手机端
  6. VSCode -> Writting snippet
  7. 爬虫:爬取某壳长租公寓数据
  8. 工业一体机在CNC机台起到什么作用?
  9. 万得与网易游戏平台开发一面
  10. 【泰安网站优化公司】SEO如何做优化?