C++生成最短路径的贪心算法SHORTEST_PATHS

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P119 算法5.10
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份

顶点数7 边数12 起始点1
顶点1 顶点2 权值

7 12 1
1 2 20
1 3 50
1 4 30
2 3 25
2 6 70
3 4 40
3 5 25
3 6 50
4 5 55
5 6 10
5 7 70
6 7 50

顶点数8 边数11 起始点1
顶点1 顶点2 权值

8 11 1
1 2 55
1 3 25
1 4 45
2 5 5
3 5 40
4 5 20
4 8 30
5 6 35
5 7 15
6 7 10
7 8 50

#include<iostream>
#include<fstream>
using namespace std;

#define MAX 9
#define MAXCOST 0x7fffffff/2  //设为最大值在46行整数加法溢出

int COST[MAX][MAX];
int DIST[MAX];
bool S[MAX];
int T[MAX];
void FindMinDist(int &u,int n)
{
    int min = DIST[0];
    for (int i = 1; i <= n; i++)
    {
        if (S[i] == 0 && DIST[i] < min)
        {
            u = i;
            min = DIST[i];
        }
    }
}
void SHORTEST_PATHS(int v,int COST[][MAX],int DIST[],int n)
{
    int u,num,i,w;

    for (i = 1; i <= n; i++)
    {
        S[i] = 0;
        DIST[i] = COST[v][i];
        T[i] = v;
    }
    S[v] = 1;
    DIST[v] = 0;
    DIST[0] = MAXCOST;

    for(num=2;num<=n;num++)
    {
        FindMinDist(u, n);
        S[u] = 1;
        for (i = 1; i <= n; i++)
        {
            if (S[i] == 0)
            {
                if (DIST[i] > (DIST[u] + COST[u][i]))
                {
                    DIST[i] = DIST[u] + COST[u][i];
                    T[i] = u;
                }
            }
        }
    }

}
int main()
{
    int i, j, k, m, n,start, cost;
    ifstream in("input.txt");
    in >> m >> n >> start;
    for (i = 0; i <= m; i++)
    {
        for (j = 0; j <= m; j++)
        {
            COST[i][j] = MAXCOST;
        }
    }
    for (k = 1; k <= n; k++)
    {
        in >> i >> j >> cost;
        COST[i][j] = cost;
        COST[j][i] = cost;
    }

    SHORTEST_PATHS(start,COST,DIST,m);

    for (i = 1; i <= m; i++)
    {
        cout << i;
        k = i;
        while (k != start)
        {
            cout << "=>" << T[k];
            k = T[k];
        }
        cout << " DIST=>" << DIST[i] << endl;
    }

    system("pause");
    return 0;
}

运行结果
C++生成最短路径的贪心算法SHORTEST_PATHS运行结果1
C++生成最短路径的贪心算法SHORTEST_PATHS运行结果2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值