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

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

思想:

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

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

③最长路径一定是从初始入度为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;
     
}
相关推荐
孤飞4 小时前
zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线
算法
技术专家5 小时前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
csdn_aspnet5 小时前
C# (QuickSort using Random Pivoting)使用随机枢轴的快速排序
数据结构·算法·c#·排序算法
鹿角片ljp6 小时前
最长回文子串(LeetCode 5)详解
算法·leetcode·职场和发展
广师大-Wzx7 小时前
一篇文章看懂MySQL数据库(下)
java·开发语言·数据结构·数据库·windows·python·mysql
paeamecium7 小时前
【PAT甲级真题】- Cars on Campus (30)
数据结构·c++·算法·pat考试·pat
chh5638 小时前
C++--模版初阶
c语言·开发语言·c++·学习·算法
RTC老炮8 小时前
带宽估计算法(gcc++)架构设计及优化
网络·算法·webrtc
dsyyyyy11018 小时前
计数孤岛(DFS和BFS解决)
算法·深度优先·宽度优先
会编程的土豆9 小时前
01背包与完全背包详解
开发语言·数据结构·c++·算法