记录编号 406048 评测结果 AAAAAAAAAA
题目名称 新的开始 最终得分 100
用户昵称 GravatarkZime 是否通过 通过
代码语言 C++ 运行时间 0.061 s
提交时间 2017-05-17 20:01:37 内存使用 1.72 MiB
显示代码纯文本
  1. # include <bits/stdc++.h>
  2. # define MAXN 303
  3. using namespace std;
  4. inline int gn() {
  5. int k = 0;
  6. char c = getchar();
  7. for(; !isdigit(c); c = getchar());
  8. for(; isdigit(c); c = getchar()) k = k * 10 + c - '0';
  9. return k;
  10. }
  11. int head[MAXN << 1], cnt, n, b[MAXN];
  12. struct edge {
  13. int fr, to, w, ne;
  14. inline edge() {;}
  15. inline edge(int fr_, int to_, int w_, int ne_) {
  16. fr = fr_, to = to_, w = w_, ne = ne_;
  17. }
  18. }e[MAXN * MAXN];
  19. inline bool cmp(edge a, edge b) {
  20. return a.w < b.w;
  21. }
  22. inline void addedge(int fr, int to, int w) {
  23. e[++cnt] = edge(fr, to, w, head[fr]), head[fr] = cnt;
  24. //e[++cnt] = edge(to, fr, w, head[to]), head[to] = cnt;
  25. }
  26. bool alr[MAXN];
  27. int fa[MAXN];
  28. int find(int x) {
  29. if(x == fa[x]) return x;
  30. else {
  31. fa[x] = find(fa[x]);
  32. return fa[x];
  33. }
  34. }
  35. inline void merge(int x, int y) {
  36. x = find(x), y = find(y);
  37. if(x != y) fa[y] = x;
  38. }
  39. inline int KRUSCAL() {
  40. int ans = 0, k = 0;
  41. for(int i = 1; i <= n; i++) fa[i] = i;
  42. sort(e + 1, e + 1 + cnt, cmp);
  43. for(int i = 1; i <= cnt; i++) {
  44. int u = e[i].fr;
  45. int v = e[i].to;
  46. if(find(u) != find(v)) {
  47. merge(u, v);
  48. ans += e[i].w;
  49. k++;
  50. }
  51. if(k == n) break;
  52. }
  53. return ans;
  54. }
  55. int main() {
  56. freopen("newstart.in", "r", stdin);
  57. freopen("newstart.out", "w", stdout);
  58. n = gn();
  59. for(int i = 1; i <= n; i++) {
  60. b[i] = gn();
  61. }
  62. for(int i = 1; i <= n; i++) {
  63. for(int j = 1; j <= n; j++) {
  64. int k = gn();
  65. if(j > i) addedge(i, j, k);
  66. }
  67. }
  68. for(int i = 1; i <= n; i++) {
  69. addedge(i, n + 1, b[i]);
  70. }
  71. cout << KRUSCAL();
  72. }