ZOJ 1586 QS Network prim优化模板

来源:互联网 发布:mmorpg推荐 知乎 编辑:程序博客网 时间:2024/05/29 17:04

链接:

1586




题意:

有一个N X N的网络,每两个点都有边相连,边的权值用邻接矩阵输入,每个点也有一个权值,当它们之间的那条边被选取时,需要加上两个点的权值。求这个网络的最小生成树。





直接套用prim算法的模板 其中用到一个节约内存的优化 将lowdistance 和visit 两个数组

结合起来 如果访问过lowdistance改成-1即可

另外该题中边的权值应为边本身的权值加上两端点的权值。





#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxx   9999999int map[1010][1010];int price[1010];int lowdis[1010];int n,ans;void prim(){    int i,j,minn,loc;    for(i=1; i<=n; i++)        lowdis[i]=map[1][i];    lowdis[1]=-1;    for(i=1; i<n; i++)    {        minn=maxx;        for(j=1; j<=n; j++)            if(lowdis[j]!=-1&&lowdis[j]<minn)                minn=lowdis[j],loc=j;        ans+=lowdis[loc];        lowdis[loc]=-1;        for(j=1; j<=n; j++)            if(lowdis[j]>map[loc][j])                lowdis[j]=map[loc][j];    }    return;}int main(){    int t,i,j;    scanf("%d",&t);    while(t--)    {        ans=0;        scanf("%d",&n);        for(i=1; i<=n; i++)            scanf("%d",&price[i]);        for(i=1; i<=n; i++)            for(j=1; j<=n; j++)            {                scanf("%d",&map[i][j]);                if(i==j)                    map[i][j]=maxx;                else                    map[i][j]+=price[i]+price[j];            }        prim();        cout<<ans<<endl;    }    return 0;}





0 0
原创粉丝点击