最小生成树 - 堆优化

const int inf = 1<<29;
int n, m;
int edge[105][105];
bool vis[105];
int d[105];

struct node
{
    int v, c;
    node(int _v = 0, int _c = 0):v(_v), c(_c){}
    friend bool operator< (node n1, node n2){
        return n1.c > n2.c;
    }
};
int ans;

void prim(){
    priority_queue<node>que;
    while(!que.empty()) que.pop();
    memset(vis, false, sizeof(vis));
    for(int i = 1; i <= n; i++){
        d[i] = edge[1][i];
        if (d[i] < inf) que.push(node(i, d[i]));
    }    
    vis[1] = true;
    ans = 0;
    int cnt = 0;
    while(!que.empty()){
        node tem = que.top();
        que.pop();
        int v = tem.v;
        int c = tem.c;
        
        if (vis[v]) continue;
        vis[v] = true;
      //  printf("v = %d c = %d\n", v, c);
        ans += c;
        cnt++;
        if (cnt == n-1) break;
        for(int i = 1; i <= n; i++){
            if (!vis[i] && edge[v][i] < d[i]){
                d[i] = edge[v][i];
                que.push(node(i, d[i]));
            }
        }
    }
    if (cnt < n-1) ans = -1;
}

int main() {
    int t;
    int a, b, c;
    
    cin >>t;
    while(t--){
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                edge[i][j] = inf;
            }
        }
        for(int i = 1; i <= m; i++){
            scanf("%d%d%d", &a, &b, &c);       
            edge[a][b] = edge[b][a] = c;
        }
        prim();
        printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2017-11-10 16:21  楼主好菜啊  阅读(407)  评论(0编辑  收藏  举报