拓扑排序,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;}


原创粉丝点击