栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态规划求解有向图的最小生成树(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态规划求解有向图的最小生成树(C语言)

思路:

这个题的核心代码是这个:  

 for(i=1;i<10;i++){
        for(j=i-1;j>=0;j--){
            if(a[j][i]+value[j]
                value[i]=a[j][i]+value[j];
                path[i]=j;}
        }
    }

i是终点,j是起点,value【i】里面存放的是起点到节点i的最短路径,这个代码块的意义在于一直 求i节点前的所有节点到i节点的最短路径,将求得的最短路径放入value【i】中,path【i】里存放的是i节点的前驱节点

题目:

因为我的那个破编译器在定义变量的时候只有第一行有效,所以我的数组是直接赋值了的,你们的编译器允许的话,还是可以把数组的值改为v的,那样就可以适用于别的有向图了,如:a【10】【10】改为a【v】【v】

代码:

#include
#define max 100
//v是顶点数 e是边
void shortdistance(int a[10][10]){
//j是起点,i是终点,path【i】存的是i的起点,value【i】存的是从起点到i的最短路径
    int i,j,path[10],value[10];
    for(i=0;i<10;i++){
        path[i]=max;
        value[i]=max;
    }
    path[0]=-1;
    value[0]=0;
    for(i=1;i<10;i++){
        for(j=i-1;j>=0;j--){
            if(a[j][i]+value[j]
                value[i]=a[j][i]+value[j];
                path[i]=j;}
        }
    }
    printf("%d ",10);
    i=9;
    j=0;
    while(path[i]>=0){
        printf(" <- %d",path[i]+1);
        i=path[i];
        j++;
        if(j==3){
            printf(" <- 1n");
            break;
        }
    }
    printf("%dn",value[9]);
}
int main(){
    int e,v,start,end,weight,i,j,a[10][10];
    printf("请输入节点数和边数:");
    scanf("%d %d",&v,&e);
    for(i=0;i
        for(j=0;j
            a[i][j]=max;
        }
    }
    printf("请输入起点,终点以及边的权值:");
    for(i=0;i
        scanf("%d %d %d",&start,&end,&weight);
        a[start-1][end-1]=weight;
    }
    shortdistance(a);
}

//测试数据

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号