1 4 6 1 2 10 2 3 10 3 1 10 1 4 1 2 4 1 3 4 1 1 3 5 6
4
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<queue> #include<stack> using namespace std; int map[510][510]; int used[510],lowcost[510],add[510]; const int N=1000000; int n,m; void init() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) map[i][j]=0; else map[i][j]=N; } } int a,b,c,d; for(int i=1;i<=m;i++) { scanf("%d %d %d",&a,&b,&c); map[a][b]=map[b][a]=c; } for(int i=1;i<=n;i++) { scanf("%d",&add[i]); } sort(add+1,add+n+1); } int prim(int n) { int sum=0; int k; for(int i=1;i<=n;i++) lowcost[i]=map[i][1]; for(int i=1;i<n;i++) { int Min=N; for(int j=2;j<=n;j++) { if(!used[j]&&lowcost[j]<Min) { Min=lowcost[j]; k=j; } } used[k]=1; sum+=Min; for(int j=1;j<=n;j++) { if(!used[j]&&map[k][j]<lowcost[j]) { lowcost[j]=map[k][j]; } } } return sum; } int main() { int T; while(~scanf("%d",&T)) { while(T--) { memset(used,0,sizeof(used)); memset(lowcost,0,sizeof(lowcost)); init(); printf("%d\n",prim(n)+add[1]); } } return 0; }
原文地址:http://blog.csdn.net/holyang_1013197377/article/details/41775407