实现用拓扑排序方法求有向无环图中最长路径长度的算法

编写程序,实现用拓扑排序方法求有向无环图中最长路径长度的算法。

思想:

①以maxDistv表示以v为结尾的最长路径,G.Edge存储的是图的边的权值,u是v的直接前驱,那么maxDistv=max(maxDistv,maxDistu+G.Edgeuv)表示:maxDistv和maxDistu+G.Edgeuv中最长的一个。

②顶点的计算顺序应该是和拓扑序列的结果一致。

③最长路径一定是从初始入度为0的顶点开始

④maxDist数组中最大值为所求maxPathvalue结果。

代码:

复制代码
typedef struct {                    // 图的定义
    int numV, numEdges;      // 图中实际的顶点数和边数
    char VerticesList[MAXV];        // 顶点表,MAXV为已定义常量
    int Edge[MAXV][MAXV];           // 邻接矩阵
}MGraph;

//获取每个结点的入度 
int *getIndegree(MGraph *G){
    int *indegree = (int*)malloc(sizeof(int)*G.numV);
    
    //初始化每个顶点的入度为0
    for(int i=0;i<G.numV;i++){
        indegree[i]=0;
    } 
    
    //遍历邻接矩阵
    for(int i=0;i<G.numV;i++){
        for(int j=0;j<G.numV;j++){
            if(G.Edge[i][j] != 0){
                indegree[j]++;
            }
        }
    } 
    return indegree
}

//拓扑遍历
bool topsort(MGraph *G){
    //topResult用来保存拓扑序列 
    int *topResult = (int*)malloc(sizeof(int)*G.numV);
    int topResultIndex = 0;
    //计算每个结点的入度 
    int *indegree=getIndegree(G);
    
    //找一个入度为0的顶点
    int stack[MAXSIZE];
    top=-1;
    
    //入度为0的顶点入队
    for(int i=0;i<G.numV;i++){
        if(indegree[i]=0){
            stack[++top]=i;
        }
    } 
    
    //栈不为空时
    while(top != -1){
        //完成拓扑排序的个数+1
        
        
        //出栈
        int v=stack[top--];
        topResult[topResultIndex++]=v;
        
        //由该顶点发出的边到到的顶点,入度均减1
        for(int i=0;i<G.numV;i++){
            if(G.Edge[v][i]==1){
                indegree[i]--;
                //出现新的入度为0的顶点
                if(indegree[i]==0){
                    //入队
                    stack[++top]; 
                } 
            }
        } 
    } 
    free(indegree);
    return topResult;
    
} 

int getMaxPath(MGraph *G){
    int topResult=topsort(G);//进行拓扑排序
    
    //maxDist[v]表示以v为结尾的最长路径 
    int *maxDist=(int*)malloc(sizeof(int)*G.numV);
    memset(maxDist,0,sizeof(int)*G.numV); 
    
    
    int maxPathvalue = -1;//最长路径长度,初始化为-1
    //按照拓扑排序的顺序进行处理
    for(int i=0;i<n;++i){
        int v=topResult[i];
        for(int u=0;u<G.numV;++u){
            if(G.Edge[u][v] != 0){//从u到v有路径 
                maxDist[v]=max(maxDist[v],maxDist[u]+G.Edge[u][v]);
                if(maxDist[v]>maxPathValue){//记录产生的最大值 
                    maxPathvalue = maxDist[v];
                }
            }
        }
    } 
    free(topRuslt);
    free(maxDist);
    
    return maxPathvalue;
     
}
相关推荐
倒头就睡的小比特10 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!10 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼11 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_5474866612 小时前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光12 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark12 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her112 小时前
并查集-听课笔记
笔记·算法·并查集
码流子13 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven13 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark13 小时前
从算法设计模式看编程思维的抽象能力4
算法