时 限: 2000 ms
内存限制: 5000 K
总时限: 3000 ms
描述: 以邻接矩阵给出一张以整数为结点的有向图,其中0表示不是相邻结点,1表示两个结点相连且由当前结点为初始点。利用拓扑排序判断图中是否有环,若有输出YES没有输出NO
输入:
结点数

邻接矩阵

输出:
YES/NO
输入样例:
3
0 1 0
1 0 1

1 0 0

输出样例: YES
/
//编译环境 codeblocks,gcc#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100//最大顶点数
#define OK 1
#define ERROR 0
int visited[MaxVertexNum];typedef int VertexType;//顶点类型
栈定义///链栈的节点
typedef struct _StackNode
{int verNum;//邻接表的顶点编号作为栈元素struct _StackNode *next;
}StackNode;//栈
typedef struct _Stack
{StackNode *top;
}Stack;//初始化栈
void InitStack(Stack &s)
{s.top=NULL;
}//栈判空
bool IsEmpty(Stack &s)
{if(s.top==NULL)return true;return false;
}//入栈
void Push(Stack &s, int num)
{StackNode *node=(StackNode*)malloc(sizeof(StackNode));node->verNum=num;node->next=s.top;s.top=node;
}
//出栈
bool Pop(Stack &s,int &e)
{if(IsEmpty(s)) return false;else{StackNode *p=s.top;e=p->verNum;s.top=p->next;free(p);return true;}
}//销毁栈
void DestroyStack(Stack &s)
{int temp;while(Pop(s,temp)){}
}邻接矩阵定义
typedef struct
{int adj;//相邻与否,或权值大小
}ArcCell;typedef struct
{VertexType vexs[MaxVertexNum];//顶点表ArcCell arcs[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表int vexnum;//图中当前的顶点数//int vexnum,arcnum;//图中当前的顶点数和边数//int Graphkind;//图的种类标志
}MGragh;///邻接表定义//
//弧(边)结点
typedef struct _ArcNode
{int adjvex;//顶点的编号(位置)struct _ArcNode *nextarc;//下一条边
}ArcNode;//顶点结点
typedef struct _VNode
{VertexType data;ArcNode *firstarc;//边表头指针int indegree;//入度
}VNode;//邻接表定义
typedef struct _AdjList
{VNode vertex[MaxVertexNum];int vexnum,arcnum;
}AdjList;//由邻接矩阵得到邻接表
AdjList *MGragh2AdjList(MGragh &M)
{int i,j;AdjList *G=(AdjList*)malloc(sizeof(AdjList));G->vexnum=M.vexnum;G->arcnum=0;for(i=0;i<M.vexnum;i++)for(j=0;j<M.vexnum;j++){if(M.arcs[i][j].adj==1){G->arcnum++;}}
//  G->arcnum=M.ArcNode *p;for(i=0;i<M.vexnum;i++){G->vertex[i].data=i;G->vertex[i].firstarc=NULL;G->vertex[i].indegree=0;}for(i=0;i<M.vexnum;i++)for(j=0;j<M.vexnum;j++){if(M.arcs[i][j].adj==1){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->nextarc=G->vertex[i].firstarc;G->vertex[i].firstarc=p;G->vertex[j].indegree++;}}return G;
}//void DisplayGraph(AdjList *G)
//{
//    ArcNode *p;
//    int i;
//    for(i=0;i<G->vexnum;i++)
//    {
//        p=G->vertex[i].firstarc;
//        printf("G->vertex[%d]=%d,indegree %d ",i,G->vertex[i].data,G->vertex[i].indegree);
//        while(p)
//        {
//            printf("%d ",p->adjvex);
//            p=p->nextarc;
//        }
//        printf("\n");
//    }
//}int ToplogicalSort(AdjList *G)
{Stack S;InitStack(S);int i,count=0;for(i=0;i<G->vexnum;i++){if(!G->vertex[i].indegree)Push(S,i);}while(!IsEmpty(S)){Pop(S,i);//printf("%d, %d",i,G->vertex[i].data);++count;ArcNode *p;for(p=G->vertex[i].firstarc;p;p=p->nextarc){int k=p->adjvex;if(!(--G->vertex[k].indegree))Push(S,k);}//for}//whileif(count<G->vexnum) {printf("YES");return 0;}else{printf("NO");return 1;};
}//main
int main()
{int vertexnum,i,j;scanf("%d",&vertexnum);MGragh M;M.vexnum=vertexnum;for(i=0;i<vertexnum;i++){M.vexs[i]=i;}for(i=0;i<vertexnum;i++)for(j=0;j<vertexnum;j++){scanf("%d",&M.arcs[i][j].adj);}AdjList *G=MGragh2AdjList(M);//DisplayGraph(G);printf("\n");ToplogicalSort(G);
//    Stack s;
//    InitStack(s);
//    DestroyStack(s);return 0;
}

拓扑排序,AVO网的判断相关推荐

  1. 拓扑排序——AOV网

    理论: 有向无环图是指一个无环的有向图,它用来描述工程或系统的进行过程. 在每一个工程过程中,可以将工程分为若干个子工程,这些子工程称为活动.如果用图中的顶点表示活动,以有向图的弧表示活动之间的优先关 ...

  2. 有向无环图——AOV网及拓扑排序

    有向无环图--AOV网及拓扑排序 有向无环图 无环的有向图叫有向无环图,简称DAG图 其应用大致如下: 在工程计划和管理方面有着广泛而重要的应用 描述一项工程或系统的进行进程的有效工具 对整个工程和系 ...

  3. C语言数据结构与算法---拓扑排序、关键路径

    文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...

  4. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  5. 拓扑排序--关键路径

    拓扑排序和关键路径是基于无环的有向图. 主要用来表示工程进度中各个事件之间的关系. 拓扑排序和关键路径 使用邻接表存储数据,最小生成树和最短路径用 邻接矩阵 存储数据. 1.拓扑排序 AOV网:在一个 ...

  6. POJ - 1094 Sorting It All Out(拓扑排序+floyd传递闭包)

    题目链接:点击查看 题目大意:给出N个点以及M个比较关系,问在第几个数字可以确定出唯一的序列,或者判断出矛盾的序列,或者最后也无法确定出一个唯一的序列 题目分析:关于这个题目可以直接分类讨论,可以直接 ...

  7. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  8. 图的应用 | 拓扑排序

    拓扑序不唯一 一个图存在拓扑序  等价于 该图为有向无环图 1.有向图的拓扑排序实现: 辅助数据结构: 记录入度的数组 indegree[]: 初始化:创建的时候同步初始化: 队列zero:记录当前入 ...

  9. 链式前向星,拓扑排序

    前向星和邻接表就是同一个思想,就不再多说 输入边为                                       邻接表 1 2                              ...

最新文章

  1. show processlist解析
  2. 计算机考研四大金刚,“四大金刚”考研一个都不少
  3. mysql 后十条_mysql几十条常用命令归纳总结
  4. word python api_WordNet Python API (整理总结)
  5. 多线程依次打印abcabc
  6. 学校计算机协会有哪些部门,大学生计算机协会部门职能划分(7页)-原创力文档...
  7. VS C++ 字符串分割 strtok
  8. 易筋SpringBoot 2.1 | 第廿二篇:SpringBoot的Mybatis分页插件PageHelper
  9. Word 公式编辑器: 快捷键
  10. node js 生成视频链接(视频流)
  11. android 监听 短信,Android短信验证码监听解决onChange多次调用的方法
  12. 经典SQL操作语句【转载】
  13. 莫纳什计算机硕士课程挂科率,莫纳什真的是挂科重灾区?
  14. Centos 鼠标左键突然失灵问题与解决
  15. 腾讯云cos申请配置
  16. Incorrect result size: expected 1, actual 2
  17. 使用FeignClient注解,进行远程http第三方调用
  18. 高效能人士七个习惯读书笔记
  19. 一起做激光SLAM[二]提取特征点和地面点
  20. delphi 类的写法 和 控制台程序的制作---深入Delphi编程

热门文章

  1. 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
  2. PCL中 的 kd-tree
  3. 简单的neo4j三元组增量插入-通过py2neo实现
  4. Python ln_LN型芯型联轴器
  5. 自动上传视频到B站和西瓜视频
  6. jQuery mouseover与mouseenter,mouseout与mouseleave的区别
  7. rrpp协议如何修改_华为交换机—RRPP协议
  8. wangeditor富文本编辑器集成配置
  9. Intellij idea 2020设置经典样式(背景为黑色Darcula)
  10. 如何解决Vray for 3ds Max中的3个错误