ZOJ 1586 QS Network prim优化模板
链接:
题意:
有一个N X N的网络,每两个点都有边相连,边的权值用邻接矩阵输入,每个点也有一个权值,当它们之间的那条边被选取时,需要加上两个点的权值。求这个网络的最小生成树。
直接套用prim算法的模板 其中用到一个节约内存的优化 将lowdistance 和visit 两个数组
结合起来 如果访问过lowdistance改成-1即可
另外该题中边的权值应为边本身的权值加上两端点的权值。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define maxx 9999999 int map[1010][1010]; int price[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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。