zoukankan      html  css  js  c++  java
  • hihoCoder#1109 最小生成树三·堆优化的Prim算法

    原题地址

    坑了我好久。。。提交总是WA,找了个AC代码,然后做同步随机数据diff测试,结果发现数据量小的时候,测试几十万组随机数据都没问题,但是数据量大了以后就会不同,思前想后就是不知道算法写得有什么问题,因为本来就没什么复杂的地方嘛!

    后来,突然灵机一动,莫非又是数组开小了?

    突然意识到,我是用数组保存图的,所以对于无向图,边数实际上是输入的2倍,于是把数组开成2倍大小,AC了。。。。

    我总算知道之前这句温馨提示的意思了。。。

    代码:

     1 #include <iostream>
     2 #include <cstring>
     3 #include <queue>
     4 
     5 using namespace std;
     6 
     7 #define MAX_POINT 2000008
     8 
     9 int N, M;
    10 int u[MAX_POINT];
    11 int v[MAX_POINT];
    12 int w[MAX_POINT];
    13 
    14 struct mycmp {
    15   bool operator()(const int &i, const int &j) const {
    16     return w[i] > w[j];
    17   }
    18 };
    19 
    20 int f[MAX_POINT];
    21 int n[MAX_POINT];
    22 priority_queue<int, vector<int>, mycmp> q;
    23 bool visited[MAX_POINT];
    24 
    25 int prime() {
    26   int res = 0;
    27   int left = N - 1;
    28 
    29   visited[1] = true;
    30   for (int i = f[1]; i != 0; i = n[i])
    31     q.push(i);
    32 
    33   while (!q.empty() && left) {
    34     int e = q.top();
    35     q.pop();
    36     if (visited[v[e]])
    37       continue;
    38     res += w[e];
    39     left--;
    40     visited[v[e]] = true;
    41     for (int i = f[v[e]]; i != 0; i = n[i]) {
    42       if (!visited[v[i]])
    43         q.push(i);
    44     }
    45   }
    46 
    47   return res;
    48 }
    49 
    50 int main() {
    51   memset(f, 0, sizeof(f));
    52   memset(visited, 0, sizeof(visited));
    53   scanf("%d%d", &N, &M);
    54   for (int i = 1, j = 1; i <= M; i++) {
    55     int a, b, c;
    56     scanf("%d%d%d", &a, &b, &c);
    57     u[j] = a;
    58     v[j] = b;
    59     w[j] = c;
    60     n[j] = f[a];
    61     f[a] = j++;
    62     u[j] = b;
    63     v[j] = a;
    64     w[j] = c;
    65     n[j] = f[b];
    66     f[b] = j++;
    67   }
    68 
    69   printf("%d
    ", prime());
    70 
    71   return 0;
    72 }
  • 相关阅读:
    原型设计 + 用户规格说明书
    第三次作业
    MathExam第二次作业
    第一次随笔
    冲鸭第一的合作
    功能规格说明书
    测试与优化
    结对编程
    高分小学计算器
    现实与梦
  • 原文地址:https://www.cnblogs.com/boring09/p/4397204.html
Copyright © 2011-2022 走看看