记录编号 235622 评测结果 AAAAAAAAAA
题目名称 新的开始 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.034 s
提交时间 2016-03-11 10:32:07 内存使用 0.66 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #define INF 0x7fffffff
  6. using namespace std;
  7. const int maxn=310;
  8. int e[maxn][maxn],n;
  9. int lowcost[maxn],closest[maxn];
  10. bool ok[maxn];
  11. int prim();
  12. int main(){
  13. #define COGS
  14. #ifdef COGS
  15. freopen("newstart.in","r",stdin);
  16. freopen("newstart.out","w",stdout);
  17. #endif
  18. scanf("%d",&n);
  19. //for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)e[i][j]=INF;
  20. for(int i=1;i<=n;i++)scanf("%d",&e[n+1][i]),e[i][n+1]=e[n+1][i];
  21. for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&e[i][j]),e[j][i]=e[i][j];
  22. n++;
  23. printf("%d\n",prim());
  24. #ifdef COGS
  25. fclose(stdin);fclose(stdout);
  26. #endif
  27. return 0;
  28. }
  29. int prim(){
  30. int result=0,min;
  31. for(int i=1;i<=n;i++)lowcost[i]=e[1][i];
  32. memset(closest,0,sizeof(int)*(n+5));
  33. memset(ok,0,sizeof(bool)*(n+5));
  34. ok[1]=true;
  35. for(int i=1;i<n;i++){
  36. min=INF;
  37. int x;
  38. for(int j=1;j<=n;j++)if(!ok[j]&&lowcost[j]<min)min=lowcost[j],x=j;
  39. ok[x]=true;
  40. result+=lowcost[x];
  41. for(int j=1;j<=n;j++)if(!ok[j]&&lowcost[j]>e[x][j])lowcost[j]=e[x][j];
  42. }
  43. return result;
  44. }