图论(拓扑排序,检查图是否存在环)

本文详细介绍了如何从邻接矩阵转换到邻接表的数据结构,并实现了一个拓扑排序算法,用于有向无环图的节点排序。通过具体的代码示例,展示了如何使用C++进行图的表示和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;

#define maxSize 101

int INF = -2313;
int MINF = 6666;//定义图的图的无穷大量

typedef struct MGraph
{
    int n,e;
    int edges[maxSize][maxSize];
};


//邻接表
typedef struct ArcNode
{
    int adjvex;//该点所指顶点的位置信息

    ArcNode *nextarc;//指向下一条边
} ArcNode;

typedef struct
{

    int data;
    int count;//统计入度信息
    ArcNode *firstarc;//指向第一条边


} VNode,AdjList;

typedef struct AGraph
{
    AdjList adjlist[maxSize];

    int n,e;

} AGraph;

int visit[1001];


//邻接矩阵转化为邻接表
void creatAGraph(AGraph *G,MGraph M)
{

    G->e = M.e;
    G->n = M.n;



    for(int i=0; i<M.n; i++) //构造顶点表
    {
        G->adjlist[i].data = i;
        G->adjlist[i].firstarc = NULL;
        G->adjlist[i].count = 0;
    }


    ArcNode *p;



    for(int i=0; i<M.n; i++) //头插法来构造
    {
        for(int j=0; j<M.n; j++)
            if(M.edges[i][j]!=0)//当存在边的时候采用头插法来构造
            {
                p = (ArcNode*)malloc(sizeof(ArcNode));

                p->adjvex = j;


                p->nextarc = G->adjlist[i].firstarc;


                G->adjlist[i].firstarc = p;


                G->adjlist[j].count++;//对应的入度加1

            }
    }//end for
}


void Visit(int v)
{
    printf("->%d",v);
}

int topSort(AGraph *G)
{
    int i,j,n = 0;

    stack<int> S;

    ArcNode *p;

    for(i=0; i<G->n; i++) //将顶点入度为0的点入栈
        if(G->adjlist[i].count ==0)
            S.push(i);

    while(!S.empty())
    {
        i = S.top();
        printf("%d->",i);

        S.pop();
        n++;

        p = G->adjlist[i].firstarc;

        //将p连接的边的入度减1
        while(p)
        {
            j = p->adjvex;
            --(G->adjlist[j].count);

            if(G->adjlist[j].count ==0)//减完之后入度等于0则将器入栈
                S.push(j);


            p = p->nextarc;//指向吓一调边
        }//end while

    }//end while

    if(n == G->n)
        return 1;
    else
        return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值