拓扑排序,AVO网的判断
来源:互联网 发布:增值税发票计算软件 编辑:程序博客网 时间:2024/06/05 20:40
时 限: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 0int 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 }//while if(count<G->vexnum) {printf("YES");return 0;} else {printf("NO");return 1;};}//mainint 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网的判断
- 拓扑排序<反向拓扑+有向环的判断>
- 判断拓扑排序
- 拓扑排序判断
- AOV网的拓扑排序
- 【算法】基于AOV网的拓扑排序
- 拓扑排序的模板
- 图的拓扑排序
- 简单的拓扑排序
- 图的拓扑排序
- 图的拓扑排序
- 图的拓扑排序
- 拓扑排序的应用
- 图的拓扑排序
- 图的拓扑排序
- 图的拓扑排序
- 图的拓扑排序
- 图的拓扑排序
- TexturePacker与PhysicsEditor
- 16进制与字符串直接的转换
- 浮点数不一定等于小数
- Java核心API需要掌握的程度
- 第12周实验报告3
- 拓扑排序,AVO网的判断
- 用Int和Rnd函数生成指定范围的随机整数
- 详解java类的生命周期
- vs2010中的Resource View和Class View都为空的有效解决办法
- 一位大牛整理的Python资料
- Cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
- Oracle中创建存储过程基本语法
- 数据仓库之拉链算法—20120508(转载)
- 2012年Web设计和开发的15个趋势