C++ 分析Prim'实现的复杂性;s算法

C++ 分析Prim'实现的复杂性;s算法,c++,graph,time-complexity,C++,Graph,Time Complexity,这是Prim的实现!事实上,这是非常复杂和缓慢的,一个更好的版本是,但我仍然想知道下面代码的时间复杂性。您也可以在这里检查相同的代码 #包括 使用名称空间std; 常数int size=12345; 数组[大小]; 整数度[大小]; 结构组件{ 布尔运算符()(常数对和ppa、常数对和ppb){ 返回ppa.first>ppb.first; } }; 整数根(整数a){ while(unionArray[a]!=a){ unionArray[a]=unionArray[unionArray[a]

这是Prim的实现!事实上,这是非常复杂和缓慢的,一个更好的版本是,但我仍然想知道下面代码的时间复杂性。您也可以在这里检查相同的代码

#包括
使用名称空间std;
常数int size=12345;
数组[大小];
整数度[大小];
结构组件{
布尔运算符()(常数对和ppa、常数对和ppb){
返回ppa.first>ppb.first;
}
};
整数根(整数a){
while(unionArray[a]!=a){
unionArray[a]=unionArray[unionArray[a]];
a=联合数组[a];
}
返回a;
}
布尔函数(整数a、整数b){
int root_a=根(a);
int root_b=根(b);
if(root_a==root_b)
返回false;
if(root_asecond,make_pair(0,it->first));
int res=0;
而(!Q.empty()){
int w=Q.top()。首先;
对温度=Q.顶部().秒;
Q.pop();
if(联合功能(温度第一,温度第二)){
res+=w;
对于(自动it=adj[temp.second].begin();it!=adj[temp.second].end();+it)
推送(配对(it->second,配对(temp.first,it->first));
}
}

你似乎在问一个特定的问题(如何分析复杂性)而不是寻求对代码的批评——特别是因为你说已经有了一个更快的实现。实际上,我之前有一个类似的复杂问题,因为在那篇文章上有很多战争,所以我决定在那里问这个问题。你能编辑这个问题并将
O((E+V)(log*N)(long E))
改为
O((E+V)(log*N)(log E))
#include <bits/stdc++.h>
using namespace std;

const int size = 12345;
int unionArray[size];
int degree[size];

struct comp {
    bool operator()(const pair<int, pair<int, int> > & ppa, const pair<int, pair<int, int> > &ppb) {
        return ppa.first > ppb.first;
    }
};

int root(int a) {
    while(unionArray[a] != a) {
        unionArray[a] = unionArray[unionArray[a]];
        a = unionArray[a];
    }
    return a;
}

bool unionFunction(int a, int b) {
    int root_a = root(a);
    int root_b = root(b);
    if(root_a == root_b)
        return false;
    if(root_a < root_b) {
        unionArray[root_a] = root_b;
        degree[root_b] += degree[root_a];
    }
    else {
        unionArray[root_b] = root_a;
        degree[root_a] += root_b;
    }
    return true;
}

int main(void) {

    int N = 0, M = 0;
    scanf("%d %d", &N, &M);

    vector<pair<int, int> > adj[N + 1];

    for(int i = 0; i < N; ++i) {
        unionArray[i] = i;
        degree[i] = 1;
    }

    for(int i = 0; i < M; ++i) {
        int x = 0, y = 0, w = 0;
        scanf("%d %d %d", &x, &y, &w);
        adj[x].push_back(make_pair(y, w));
        adj[y].push_back(make_pair(x, w));
    }

    priority_queue<pair<int, pair<int, int> >, vector<pair<int, pair<int, int> > >, comp > Q;


    for(auto it = adj[0].begin(); it != adj[0].end(); ++it)
        Q.push(make_pair(it->second, make_pair(0, it->first)));

    int res = 0;

    while(!Q.empty()) {
        int w = Q.top().first;
        pair<int, int> temp = Q.top().second;
        Q.pop();
        if(unionFunction(temp.first, temp.second)) {
            res += w;
            for(auto it = adj[temp.second].begin(); it != adj[temp.second].end(); ++it)
                Q.push(make_pair(it->second, make_pair(temp.first, it->first)));
        }
    }

    cout << res << "\n";
    return 0;
}