邻接矩阵的拓扑排序

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

#define MAX_VERTEX_NUM 11    //顶点的最大数
#define INFINITY 32768                
#define Error 0
#define OK 1

typedef enum{DG,DN,UDG,UDN}    GraphKind;    //图的种类 G表示有向图, DN表示有向网, UDG表示无向图, UDN表示无向网
typedef char VertexData;

typedef struct ArcNode
{
        int adj;
}ArcNode;

typedef struct
{
    VertexData vexs[MAX_VERTEX_NUM];                //顶点向量
    ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];        //邻接矩阵
    int  vexnum,arcnum;                        //图的顶点 和 弧数
    GraphKind kind ;        
}AdjMatrix;

int LocateVertex(AdjMatrix *G, VertexData v)                //求顶点的位置坐标
{
        int  j = Error , k;
        for(k=0; k< G->vexnum; k++)
            if( G->vexs[k] == v)
            {
                j = k;
                break;
            }
        return j;
}
int CreateDN(AdjMatrix *G)
{
    int i,j,k,weight;
    VertexData v1,v2;
    printf("请输入顶点的个数和弧数");
    scanf("%d%d",&G->vexnum,&G->arcnum);

    for(i =0; i<G->vexnum;i++)            //初始化
        for(j=0;j<G->vexnum;j++)
            G->arcs[i][j].adj = INFINITY ;

    for(i=0;i<G->vexnum;i++)
    {
            printf("请输入图的顶点\n");
            fflush(stdin);
            scanf("%c",&G->vexs[i]);
    }
    for(k=0;k<G->arcnum;k++)
    {
        printf("请输入一条弧的两个顶点及权值");
            fflush(stdin);
        scanf("%c,%c,%d",&v1,&v2,&weight);
        i = LocateVertex(G,v1);
        j = LocateVertex(G,v2);
        G->arcs[i][j].adj = weight;        //建立弧
    }
        return OK;
}
void FindID(AdjMatrix G,int indegree[])
{
    int i,j;
    for(i=0;i<G.vexnum;i++)
        for(j=0;j<G.vexnum;j++)
            if(G.arcs[i][j].adj !=32768)
                    indegree[j] ++;
}

bool TopSort(AdjMatrix G)
{
    int stack[100] = {0};
    int top=0;
    int indegree[50]={0};
    int i,j,count,p;
    FindID(G,indegree);
    for(i=0;i<G.vexnum;i++)
        if(indegree[i] == 0)
             stack[top++] = i;
    count = 0;
    while(top!=0)
    {
        i = stack[--top];
        printf("%c ",G.vexs[i]);
        count ++ ;
        for(    p = -1,j = 0 ;j<G.vexnum;j++)    //找第一个邻接点
            if(G.arcs[i][j].adj != 32768)
            {    p = j; break; }

        while( p != -1)
        {
                indegree[p] --;
                if( indegree[p] == 0)
                    stack[top++] = p;

        for(    j = p+1 ;j<G.vexnum;j++)                //找下一个邻接点
            if(G.arcs[i][j].adj != 32768)
            {p = j; break;}
            
            if( j == G.vexnum ) p = -1;                 //未找到
        }

    } // while

    return count < G.vexnum ? Error: OK ; 
}

int _tmain(int argc, _TCHAR* argv[])
{
    AdjMatrix G;
    CreateDN(&G);
    if(!TopSort(G))        printf("\n存在回路!\n");
    return 0;
}
时间: 2024-10-10 05:38:48

邻接矩阵的拓扑排序的相关文章

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

hdu1285 拓扑排序

思路: 选择一个入度为0的顶点并输出,从网中删除此顶点及所有出边. 循环结束后,若输出的定点数小于网中的顶点数,则输出有回路信息,否则输出的顶点就是一种拓扑序列. 具体实现方法:邻接表,时间复杂度较小,邻接矩阵,时间复杂度高 确定比赛名次 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,

算法系列笔记6(有关图的算法一—搜索,拓扑排序和强连通分支)

简单概念:对于图G(V,E),通常有两种存储的数据结构,一种是邻接矩阵,此时所需要的存储空间为O(V^2):第二种是邻接表,所需要的存储空间为O(V+E).邻接表表示法存在很强的适应性,但是也有潜在的不足,当要快速的确定图中边(u,v)是否存在,只能在顶点u的邻接表中搜索v,没有更快的方法,此时就可以使用邻接矩阵,但要以占用更多的存储空间作为代价:此外当图不是加权的,采用邻接矩阵存储还有一个优势:在存储邻接矩阵的每个元素时,可以只用一个二进位,而不必用一个字的空间. 图的搜索算法 搜索一个图示有

java实现AOV图的拓扑排序

拓扑排序作为图的应用,了解拓扑排序必须首先了解AOV图. AOV网表示一个有向图中顶点,用弧表示顶点之间的优先关系.如下图所示,在AOV网中,若从顶点vi到顶点vj之间存在一条有向路径,则称顶点vi为顶点vj的前驱,顶点vj为顶点vi的后继.注意,AOV图不能有回路,否则会将序列陷入死循环,称为死锁. 进行拓扑排序,一般步骤如下: <1>在AOV网中选择一个入度为0的顶点 <2>在AOV网中删除此顶点及其相连的有向边 <3>重复步骤<1>和<2>

JAVA邻接表实现拓扑排序

由于一直不适用邻接表 ,现在先贴一段使用邻接矩阵实现图的拓扑排序以及判断有无回路的问题.自己做的图.将就看吧. package TopSort; import java.util.LinkedList; import java.util.Scanner; /*拓扑序列:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性 * 序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. * */ p

hiho47 : 拓扑排序&#183;一

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来. 小Ho:小Hi,你这学期有选什么课么? 小Hi:挺多的,比如XXX1,XXX2还有XXX3.本来想选YYY2的,但是好像没有先选过YYY1,不能选YYY2. 小Ho:先修课程真是个麻烦的东西呢. 小Hi:没错呢.好多课程都有先修课程,每次选课之前都得先查查有没有先修.教务公布的先修课程记录都是好多年前的,不但有重复的信息,好像很多都不正确了. 小Ho:课程

有向拓扑排序的应用

首先输入n个点,表示有向图中有n个顶点,接下来n行, 每行输入几个数字,第i行的数字表示它们是顶点i的后继节点,输出要求保证该行的编号要在这几个数前面,当数字为0时,表示i点没有后继节点了. 就是要求输出这个有向图的拓扑序列.[输入输出]: [样例]: Sample Input504 5 1 01 05 3 03 0 Sample Output2 4 5 3 1 package Main; import java.util.PriorityQueue; import java.util.Queu

HDU 1285-确定比赛名次(拓扑排序)

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12678    Accepted Submission(s): 5095 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

数据结构:图--拓扑排序

拓扑排序 拓扑排序 在实际应用中,有向图的边可以看做是顶点之间制约关系的描述.把顶点看作是一个个任务,则对于有向边<Vi,Vj>表明任务Vj的完成需等到任务Vi完成之后,也就是说任务Vi先于任务Vj完成.对于一个有向图,找出一个顶点序列,且序列满足:若顶点Vi和Vj之间有一条边<Vi,Vj>,则在此序列中顶点Vi必在顶点Vj之前.这样的一个序列就称为有向图的拓扑序列(topological order). 步骤 从有向图中选取一个没有前驱(入度为0)的顶点输出. 删除图中所有以它为