算法题,进链接看文本,不限语言c/c++/python都可以,伪代码也行,请会的留下代码最好带下注释

算法题,进链接看文本,不限语言c/c++/python都可以,伪代码也行,请会的留下代码最好带下注释

问题描述:


链接: https://pan.baidu.com/s/1vEu6L27XAzdgkUOuOE-38g

提取码: 1ksf

    #include <stdio.h>
    int main()
    {
        int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;
        int inf=-99999999; //用inf(infinity的缩写)存储一个我们认为的负无穷值
        //读入n和m,n表示顶点个数,m表示边的条数
        scanf("%d %d",&n,&m);

        //初始化
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(i==j) e[i][j]=0;
                  else e[i][j]=inf;

        //读入边
        for(i=1;i<=m;i++)
        {
            scanf("%d %d %d",&t1,&t2,&t3);
            e[t1][t2]=t3;
        }
        //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
        for(i=1;i<=n;i++)
            dis[i]=e[1][i];
        //book数组初始化
        for(i=1;i<=n;i++)
            book[i]=0;
        book[1]=1;

        //Dijkstra算法核心语句
        for(i=1;i<=n-1;i++)
        {
            //找到离1号顶点最近的顶点
            min=inf;
            for(j=1;j<=n;j++)
            {
                if(book[j]==0 && dis[j]>min)
                {
                    min=dis[j];
                    u=j;
                }
            }
            book[u]=1;
            for(v=1;v<=n;v++)
            {
                if(e[u][v]>inf)
                {
                    if(dis[v]<dis[u]*e[u][v])
                        dis[v]=dis[u]*e[u][v];
                }
            }
        }

        //输出最终的结果
        for(i=1;i<=n;i++)
            printf("%d ",dis[i]);

        getchar();
        getchar();
        return 0;
    }

文本内容不能贴到这里吗,反正我是不想因为回答问题还要弄个网盘。

Dijkstra 算法是算两点之间的最小距离,是距离相加。 你这个题目是算两点之间的最大概率。题目说了概率独立,就是边概率相乘,求最大。

所以跟Dijkstra 没啥区别。把Dijkstra 算法的极大值改成极小值,判断符号方向反过来,加法改成乘法 就可以。