QS Network(最小生成树)

题意:若两个QS之间要想连网,除了它们间网线的费用外,两者都要买适配器, 求使所有的QS都能连网的最小费用。

分析:这个除了边的权值外,顶点也有权值,因此要想求最小价值,必须算边及顶点的权值和。

解决方法:用prim算法,在构造邻接矩阵时,在i到j的权值的基础上再加上i点的权值和j点的权值即可。

附上AC代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define infinity 1000000
#include<iostream>
#include<algorithm>
using namespace std;
int N;
int G[501][501];
int QS[1000];
int lowcost[100000],closeset[100000];
int used[100000];
int prim(int vcount)
{
    int sum=0;
    int i,j,k;
    int min;
    for (i=0; i<vcount; i++)
    {
        lowcost[i]=G[0][i];
        closeset[i]=0;
        used[i]=0;
    }
    used[0]=1;
    for (i=1; i<=vcount-1; i++)
    {
        j=0;
        min = infinity;
        for (k=1; k<vcount; k++)
            if ((!used[k])&&(lowcost[k]<min))
            {
                min =lowcost[k];
                j=k;
            }
        used[j]=1;
        sum+=min;
        for (k=1; k<vcount; k++)
            if (!used[k]&&(G[j][k]<lowcost[k]))
            {
                lowcost[k]=G[j][k];
                closeset[k]=j;
            }
    }
    return sum;
}
int main()
{
    int t,i,j,n,sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&QS[i]);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&G[i][j]);
                G[i][j]=G[i][j]+QS[i]+QS[j];
            }
        }
        sum=prim(n);
        printf("%d\n",sum);
    }
    return 0;
}

  prim算法详见:http://www.cnblogs.com/PJQOOO/p/3855017.html。我是按照这个学的最小生成树。

                                                                                                                                                                                  ————Anonymous.PJQ

QS Network(最小生成树),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。