kruskal50分求助!
查看原帖
kruskal50分求助!
277571
白给的菜鸟楼主2020/12/4 11:46
#include <iostream>
#include <queue>
using namespace std;
struct tmp {
  int x;
  int dis;
  int to;
  friend bool operator<(tmp a, tmp b) { return a.x > b.x; }
};
int n, m, q = 1;
int t[6000];
long long sum;
priority_queue<tmp> x;
int main(int argc, const char** argv) {
  cin >> n >> m;
  for (size_t i = 0; i < m; i++) {
    register tmp z;
    cin >> z.dis >> z.to >> z.x;
    x.push(z);
  }
  while (!x.empty()) {
    register tmp z = x.top();
    x.pop();
    if (t[z.dis] == 0 && t[z.to] == 0) {
      sum += z.x;
      t[z.dis] = q;
      t[z.to] = q;
      q++;
      continue;
    }
    if (t[z.dis] == 0) {
      sum += z.x;
      t[z.dis] = t[z.to];
      continue;
    }
    if (t[z.to] == 0) {
      sum += z.x;
      t[z.to] = t[z.dis];
      continue;
    }
    if (t[z.dis] != t[z.to]) {
      sum += z.x;
      int pp = min(t[z.dis], t[z.to]);
      int qq = max(t[z.dis], t[z.to]);
      for (int i = 1; i <= n; i++)
        if (t[i] == qq) t[i] = pp;
      continue;
    }
  }

  // int p = 1, pp = t[1];
  // for (size_t i = 1; i <= n; ++i)
  //   if (t[i] != pp) p = 0;
  // if (p == 1 && pp != 0)
  cout << sum;
  // else
  //   cout << "orz";
  return 0;
}
#include <algorithm>
#include <iostream>
using namespace std;
struct tmp {
  int x;
  int dis;
  int to;
} z[(int)1e6];
int n, m, q = 1;
int t[6000];
long long sum;

bool cmp1(tmp a, tmp b) { return a.x < b.x; }

int main(int argc, const char** argv) {
  cin >> n >> m;
  for (size_t i = 0; i < m; i++) {
    cin >> z[i].dis >> z[i].to >> z[i].x;
  }

  sort(z, z + m, cmp1);

  int www = 0;
  while (www < m) {
    if (t[z[www].dis] == 0 && t[z[www].to] == 0) {
      sum += z[www].x;
      t[z[www].dis] = q;
      t[z[www].to] = q;
      q++;
      continue;
    }
    if (t[z[www].dis] == 0) {
      sum += z[www].x;
      t[z[www].dis] = t[z[www].to];
      continue;
    }
    if (t[z[www].to] == 0) {
      sum += z[www].x;
      t[z[www].to] = t[z[www].dis];
      continue;
    }
    if (t[z[www].dis] != t[z[www].to]) {
      sum += z[www].x;
      int pp = min(t[z[www].dis], t[z[www].to]);
      int qq = max(t[z[www].dis], t[z[www].to]);
      for (int i = 1; i <= n; i++)
        if (t[i] == qq) t[i] = pp;
      continue;
    }
    www++;
  }

  // int p = 1, pp = t[1];
  // for (size_t i = 1; i <= n; ++i)
  //   if (t[i] != pp) p = 0;
  // if (p == 1 && pp != 0)
  cout << sum;
  // else
  //   cout << "orz";
  return 0;
}

上面是用的优先队列,以为是优先队列用错了改用下面的sort 都是50分,只对了1,5,7,9,10; 有没有大佬看一下是什么问题? 拜谢

2020/12/4 11:46
加载中...