Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <iostream>
- #include <math.h>
- #include <queue>
- #include <vector>
- #define N 101
- using namespace std;
- int n, m;
- vector <vector <int> > graph;
- vector <vector <int> > graph2;
- vector <int> way;
- vector <int> isAdded;
- struct EL {
- int data;
- int x;
- int y;
- EL* next;
- EL(int num, int i, int j) {
- data = num;
- x = i;
- y = j;
- next = NULL;
- }
- };
- struct Queue {
- EL* front;
- EL* back;
- int siz;
- Queue() {
- front = NULL;
- back = NULL;
- siz = 0;
- }
- void push(int num, int i, int j) {
- siz++;
- EL* t = new EL(num, i, j);
- if(front == NULL){
- back = t;
- front = t;
- return;
- }
- back->next = t;
- back = t;
- }
- EL* pop() {
- if (front == NULL) return NULL;
- siz--;
- EL* t = front;
- front = front->next;
- return t;
- }
- void printQueue(EL* t) {
- cout << t->data << " ";
- if (t->next != NULL) printQueue(t->next);
- }
- };
- Queue *q = new Queue();
- void fillArr() {
- for (int i = 1; i <= m; i++) {
- int x, y, siz;
- cin >> x >> y >> siz;
- graph[x][y] = graph[y][x] = siz;
- }
- }
- void func(int k) {
- for (int i = 1; i <= n; i++) {
- if (graph[k][i] != 0 && isAdded[i] == 0) {
- q->push(graph[k][i], k, i);
- }
- }
- }
- void algPrima() {
- for (int i = 1; i <= n; i++) {
- if (isAdded[i] == 1) {
- func(i);
- }
- }
- //q->printQueue(q->front);
- //cout << "\n";
- //cout << q->siz << "\n";
- int min = pow(2.0, 30);
- int iMin = 0, jMin = 0;
- int temp = q->siz;
- for (int i = 1; i <= temp; i++) {
- EL *t = q->pop();
- if (t->data < min) {
- min = t->data;
- iMin = t->x;
- jMin = t->y;
- }
- }
- //cout << q->siz << "\n";
- graph2[iMin][jMin] = graph2[jMin][iMin] = min;
- isAdded[jMin] = isAdded[iMin] = 1;
- }
- void output() {
- int sum = 0;
- for (int i = 1; i <= n; i++) {
- for (int j = i + 1; j <= n; j++) {
- sum += graph2[i][j];
- }
- }
- cout << sum;
- }
- void printGraph() {
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= n; j++) {
- cout << graph2[i][j] << " ";
- }
- cout << "\n";
- }
- }
- int main() {
- cin >> n >> m;
- graph.assign(n + 1, vector <int>() );
- graph2.assign(n + 1, vector <int>() );
- way.assign(n + 1, 0);
- isAdded.assign(n + 1, 0);
- for (int i = 1; i <= n; i++) {
- graph[i].assign(n + 1, 0);
- graph2[i].assign(n + 1, 0);
- }
- fillArr();
- isAdded[1] = 1;
- for (int i = 2; i <= n; i++) {
- algPrima();
- }
- //printGraph();
- output();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement