main.cc 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <set>
  5. #include <vector>
  6. using namespace std;
  7. const int N = 100;
  8. const int INF = 0x3F3F3F3F;
  9. int dist[N];
  10. struct E {
  11. int v;
  12. int w;
  13. E(int v = 0, int w = INF) : v(v), w(w) {}
  14. bool operator<(const E &that) const { return this->w > that.w; }
  15. };
  16. int main() {
  17. int n, len, used;
  18. while (scanf("%d", &n) != EOF) {
  19. vector<vector<E>> adj;
  20. for (int i = 0, w; i < n; i++) {
  21. adj.push_back(vector<E>());
  22. for (int j = 0; j < n; j++) {
  23. scanf("%d", &w);
  24. adj[i].push_back(E(j, w));
  25. }
  26. }
  27. memset(dist, 0x3F, sizeof(dist));
  28. dist[0] = 0, len = 0, used = 1;
  29. priority_queue<E> pq;
  30. for (int i = 0; i < adj[0].size(); i++) pq.push(adj[0][i]);
  31. while (used != n) {
  32. E e;
  33. do {
  34. e = pq.top();
  35. pq.pop();
  36. } while (dist[e.v] != INF);
  37. dist[e.v] = e.w;
  38. len += e.w;
  39. used++;
  40. for (int i = 0; i < adj[e.v].size(); i++) {
  41. E &u = adj[e.v][i];
  42. if (dist[u.v] == INF) pq.push(u);
  43. }
  44. }
  45. printf("%d\n", len);
  46. }
  47. return 0;
  48. }