拓扑排序,AVO网的判断

时 限: 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
    }//while
    if(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;
}


你可能感兴趣的:(struct,null)