zoj 1586 最小生成树prim水题

/*
题意:QS之间互相通信分别需要一定价钱的cable以及QS与每个其它QS相连都需要一个adapter,每个QS都有自己
喜欢的adapter(即第i个QS用固定价格的adapter),给出n个adapter的价格以及n*n的矩阵(表示i,j连接的cable
的价格),求最少用多少钱;

题解:模板水题,最小生成树prim
在输入n*n的矩阵时顺便把adapter的费用也加入边中,每条边相连需要两个adapter
*/
#include <iostream>
#include <cstring>

using namespace std;

#define VERMAX 1005

int map[VERMAX][VERMAX];
int adapter[VERMAX];

int prim(int n)
{
    bool vis[VERMAX];
    int low[VERMAX];
    int pos = 1;
    memset(vis,false,sizeof(vis));
    vis[pos] = true;

    int ret = 0;
    for(int i=1; i<=n; i++)
        low[i] = map[pos][i];
    for(int i=1; i<n; i++)
    {
        int min = 100000000;
        for(int j=1; j<=n; j++)
        {
            if (!vis[j] && low[j] < min)
            {
                min = low[j];
                pos = j;
            }
        }
        ret += min;
        vis[pos] = true;
        for(int j=1; j<=n; j++)
            if (!vis[j] && low[j] > map[pos][j])
                low[j] = map[pos][j];
    }
    return ret;
}

int main(void)
{
    int t,n;
    cin >> t;
    while (t--)
    {
        cin >> n;
        for(int i=1; i<=n; i++)
        {
            cin >> adapter[i];
        }
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                cin >> map[i][j];
                if (i != j)
                    map[i][j] += (adapter[i] + adapter[j]);
            }
        cout << prim(n) << endl;
    }
    return 0;
}

 

posted @ 2014-03-21 00:10  辛力啤  阅读(432)  评论(0编辑  收藏  举报