Pagini recente » Cod sursa (job #2902752) | Cod sursa (job #1455327) | Cod sursa (job #145578) | Cod sursa (job #3152778) | Cod sursa (job #2853632)
#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);
}