#ifndef MSTREE_H
#define MSTREE_H

#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

class Sets
{
        public:
        Sets(int);
        void Union(int i, int j) { parent[i] = j; }
        int Find(int i) { while (parent[i]>=0) i = parent[i]; return i; }
        private:
        int *parent;
        int n;
};

Sets::Sets(int numberOfElements) 
{
        if (numberOfElements < 2) throw "Must have at least 2 elements.";
        n = numberOfElements;
        parent = new int[n];
        fill(parent, parent + n, -1);
}

int NNODES;

struct Edge 
{
        int v1, v2;
        double weight;
        bool operator==(Edge& e2) { return (v1==e2.v1 && v2==e2.v2); }
        bool operator!=(Edge& e2) { return (v1!=e2.v1 || v2!=e2.v2); }
};

ostream& operator<<(ostream& os, Edge& e) 
{
        os << "(" << e.v1 << "," << e.v2 << ") : " << e.weight << endl;
        return os;
}

bool GetEdge(istream& is, Edge& e) 
{
// make sure that node number is 0 to NNODES-1
        is >> e.v1 >> e.v2 >> e.weight; if (!is.good()) 
                return false;
        if (e.v1<0 || e.v1>=NNODES || e.v2<0 || e.v2>=NNODES || e.v1==e.v2)
                throw "Incorrect Edge";
        if (e.v2 < e.v1) swap(e.v1, e.v2); // low-numbered vertex first
                return true;
}

class Compare 
{
        public:
        bool operator() (Edge e1, Edge e2) { return e1.weight > e2.weight; }
};

#endif


#include "mstree.h"

priority_queue< Edge, vector<Edge>, Compare > PQ1;

queue< Edge > *Q;

void MoveIntoPQ_EdgeOfNodes(int v) {

        while( !Q[v].empty() ) 
        {
                Edge e = Q[v].front();
                Q[v].pop();
                PQ1.push(e);
        }
}

void prim() 
{

        Sets sets (NNODES);
        int nedges = 0;

        while(nedges < NNODES - 1)
        {
                if(PQ1.empty() ) throw "No Spanning Tree Exists. ";
                Edge e = PQ1.top(); PQ1.pop();
                int root0 = sets.Find(0);

                int v1root = sets.Find(e.v1); int v2root = sets.Find(e.v2);
                if (v1root != v2root) 
                
                        sets.Union(v1root, v2root);
                        nedges++;
                        cout << e;
                }
        }
}

void ReadEdges4prim( istream& is) 
{
        Q = new queue<Edge> [NNODES];
        Edge e;

        while (GetEdge( is, e) )
        {
                Q[e.v1].push(e);
                Q[e.v2].push(e);
        }
        MoveIntoPQ_EdgeOfNodes(3);
}
int main(int argc, char *argv[])
{
        ifstream is; if (argc==1) is.open("prim.in"); else is.open(argv[1]);
        if (!is) { cerr << "No such input file\n"; exit(1); }
        is >> NNODES;
        if (NNODES < 2) { cerr << "#nodes must be 2.." << endl; exit(1); }

        try { ReadEdges4prim(is); prim(); }
        catch (char const *str)
        { cerr << "Exception: " << str << endl; exit(1); }
}

여기서 0부터 시작해서 쭉 이어져야 하는데

어떻게 해야될질 모르겠어요

알려주십쇼!!!