链接:
题意:
有一个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; }
时间: 2024-10-10 17:11:52