用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

畅通工程之局部最小花费问题

2017-11-16 作者: 芙蓉妹妹举报

[c++]代码库

#include<bits/stdc++.h>
using namespace std;
int Dist[200], TF[200], M[200][200];
int Prime(int N)
{
    int sum = 0, i, j;
    for ( i = 2 ; i <= N; i ++)
    {
        Dist[i] = M[1][i];
        TF[i] = 0;
    }
    TF[1] = 1;
    Dist[1] = 0;
    for (i = 1; i < N; i ++)
    {
        int min = 9999, k = -1;//找与顶点1相邻的最小的权值,k用来记最小值得下标
        for (j = 1; j <= N; j ++)
        {
            if (Dist[j] < min && !TF[j])
            {
                min = Dist[j];
                k = j;
            }
        }
        TF[k] = true;//记录该顶点已经可以到达
        if (k != -1)//找到了最小的权值
        {
            sum += Dist[k];//加入成本
            for ( j = 1; j <= N; j ++)//从最新的顶点出发,刷新新的权值,继续找下一个最小的权值
            {
                if (Dist[j] > M[k][j] && !TF[j])
                    Dist[j] = M[k][j];
            }
        }
    }
    return sum;
}
int main()
{
    int N, i, j;
    cin>>N;
    for ( i = 1; i <= N; i ++)
        for ( j = 1; j <= N; j ++)
            M[i][j] = 9999;//首先所有的边都初始化为无穷大
    for ( i = 1; i <= N*(N-1)/2 ; i ++)//按行输入,以邻接矩阵形式存储
    {
        int a, b, c, d;
        cin>>a>>b>>c>>d;
        if ( d == 1 )//若已修建该道路,则该道路权值定为0
            M[a][b] = M[b][a] = 0;
        else//否则,权值定为修建该道路的成本
            M[a][b] = M[b][a] = c;
    }
    cout<<Prime(N);
    return 0;
}


网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...