题解 P1194 【买礼物】

· · 题解

一道十分简单的最小生成树的问题

主要问题是将初始条件设置好

如果两个不同商品间没有优惠,那么这条路径就设为A

构造好最小生成树后,只需要把所有路径累积即可

注意:不要忘了在最后答案加上一个A(第一个东西还是没优惠的)

上代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 501;
const int INF = 0x7fffffff;
int f[maxn][maxn];
int dis[maxn];
bool s[maxn];
int main ()
{
    //freopen("present.in","r",stdin);
    int cost,n;
    cin >> cost >> n;
    for (int i = 1;i <= n;i ++)
    for (int j = 1;j <= n;j ++)
    {
        cin >> f[i][j];
        if(i == j) {
            f[i][j] = INF;//自己和自己直接就直接赋极大值
            continue;
        }
        if(!f[i][j]) f[i][j] = cost;
        f[j][i] = f[i][j];//无向图
    }
    for(int i = 1;i <= n;i ++) dis[i] = INF;
    dis[1] = 0;
    for(int i = 1;i <= n;i ++)//prim算法求最小生成树
    {
        int cmin = INF,p;
        for(int j = 1;j <= n;j ++)
            if(dis[j] < cmin&&!s[j]){
                cmin = dis[j];
                p = j;
            }
        s[p] = true;
        for(int j = 1;j <= n;j ++){
            if(f[p][j] < dis[j]&&!s[j]) dis[j] = f[p][j];
        }
    }
    int sum = 0;
    for(int i = 1;i <= n;i ++) sum += dis[i];
    cout << sum + cost;//不要忘了加一个基本价值
}