Cod sursa(job #2853632)

Utilizator dan10Suba Daniel dan10 Data 20 februarie 2022 14:39:26
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <limits.h>

using namespace std;

ifstream be("apm.in");
ofstream ki("apm.out");

#define INF 999999

struct edge {
    int from;
    int to;
    int weight;
};

void read(int& n, int& m, int wMatr[][200001]) {
    be >> n >> m;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            wMatr[i][j] = INF;
        }
    }

    for (int i = 1; i <= m; i++) {
        int from, to, weight;
        be >> from >> to >> weight;
        wMatr[from][to] = weight;
        wMatr[to][from] = weight;
    }
}

void prim(int n, int m, int wMatr[][200001], edge* mTree, int& mF, int start) {
    bool bMatr[101][101] = { 0 };
    bool visited[101] = { 0 };
    int vis = 1;
    visited[start] = 1;

    int wSum = 0;

    while (vis < n) {
        int minimum = INT_MAX;
        int min_index_from = -1, min_index_to = -1;
        for (int i = 1; i <= n; i++) {
            if (visited[i] == true) {
                for (int j = 1; j <= n; j++) {
                    if (wMatr[i][j] != INF && visited[j] == false && wMatr[i][j] < minimum && bMatr[i][j] == 0) {
                        minimum = wMatr[i][j];
                        min_index_from = i;
                        min_index_to = j;
                    }
                }
            }
        }
        bMatr[min_index_from][min_index_to] = 1;
        visited[min_index_to] = 1;
        vis++;
        mF++;
        mTree[mF].from = min_index_from;
        mTree[mF].to = min_index_to;
        mTree[mF].weight = minimum;
        wSum += minimum;
    }

    ki << wSum << endl;
    ki << mF << endl;
    for (int i = 1; i <= mF; i++) {
        ki << mTree[i].from << " " << mTree[i].to << endl;
    }

}

int main()
{
    int n, m;
    int wMatr[200001][200001];
    int mF = 0;
    edge mTree[201];
    read(n, m, wMatr);
    prim(n, m, wMatr, mTree, mF, 1);
}