fork download
  1. /*
  2.   Copyright 2012 Marek "p2004a" Rusinowski
  3.   Computing MST - Prim's algorithm
  4. */
  5. #include <cstdio>
  6. #include <set>
  7. #include <vector>
  8. #include <algorithm>
  9.  
  10. #define MAXN 1000000
  11. #define INF 0x7FFFFFFF
  12.  
  13. std::vector<std::pair<int, int> > edges[MAXN], out;
  14. int d[MAXN], p[MAXN];
  15.  
  16. struct cmp {
  17. bool operator() (int a, int b) {
  18. if (d[a] < d[b]) {
  19. return true;
  20. } else if (d[a] > d[b]) {
  21. return false;
  22. } else {
  23. return a < b;
  24. }
  25. }
  26. };
  27.  
  28. void mst(int n) {
  29. std::set<int, cmp> q;
  30. std::fill(d + 1, d + n, INF);
  31. q.insert(0);
  32. while (!q.empty()) {
  33. int v = *(q.begin());
  34. q.erase(q.begin());
  35. if (v != 0) {
  36. out.push_back(std::make_pair(p[v], v));
  37. }
  38. for (int i = 0; i < (int) edges[v].size(); ++i) {
  39. if (d[edges[v][i].first] > d[v] + edges[v][i].second) {
  40. q.erase(edges[v][i].first);
  41. d[edges[v][i].first] = d[v] + edges[v][i].second;
  42. p[edges[v][i].first] = v;
  43. q.insert(edges[v][i].first);
  44. }
  45. }
  46. }
  47. }
  48.  
  49. int main() {
  50. int n, m, a, b, c;
  51. scanf("%d %d", &n, &m);
  52. for (int i = 0; i < m; ++i) {
  53. scanf("%d %d %d", &a, &b, &c);
  54. --a, --b;
  55. edges[a].push_back(std::make_pair(b, c));
  56. edges[b].push_back(std::make_pair(a, c));
  57. }
  58. mst(n);
  59. for (int i = 0; i < (int) out.size(); ++i) {
  60. printf("%d %d\n", out[i].first + 1, out[i].second + 1);
  61. }
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0.01s 22568KB
stdin
11 14
2 11 1
5 7 2
3 11 3
3 7 4
7 9 5
9 10 6
8 9 7
2 7 8
7 10 9
1 2 10
2 6 11
3 10 12
5 10 13
3 4 14
stdout
1 2
2 11
11 3
2 7
7 5
2 6
7 9
3 10
3 4
9 8