Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- using namespace std;
- struct edge
- {
- int idx;
- int a;
- int b;
- int cost;
- };
- struct vertex
- {
- bool visited = false;
- std::vector<struct edge> adj_list;
- int count_edges = 0;
- };
- void addEdge(int i, int j, int cost, vector<vertex>& vertexes)
- {
- edge buff;
- buff.idx = j;
- buff.edge_value = cost;
- vertexes[i].adj_list.push_back(buff);
- buff.idx = i;
- vertexes[j].adj_list.push_back(buff);
- vertexes[i].count_edges++;
- vertexes[j].count_edges++;
- }
- struct Compare
- {
- bool operator()(edge& o1, edge& o2) const
- {
- return o1.cost > o2.cost;
- }
- };
- void showpq(priority_queue<struct edge, vector<struct edge>, Compare> gq)
- {
- priority_queue<struct edge, vector<struct edge>, Compare> g = gq;
- while (!g.empty())
- {
- cout << '\t' << g.top().cost;
- g.pop();
- }
- cout << '\n';
- }
- int main()
- {
- priority_queue<struct edge, vector<struct edge>, Compare> heap;
- int n, m;
- cin >> n >> m;
- int a,b,c;
- vector<struct vertex> vertexes(n);
- struct edge edge;
- for (int i = 0; i < m; ++i)
- {
- cin >> a >> b >> c;
- addEdge(a-1, b-1, cost, vertexes);
- if (a == 1 | b == 1)
- {
- edge.a = a;
- edge.b = b;
- edge.cost = cost;
- heap.push(edge);
- }
- }
- visited[0] = true;
- struct edge edge;
- int new;
- int max = 0;
- for (int i = 0; i < n; ++i)
- {
- edge = heap.pop();
- if (max < edge.cost)
- max = edge.cost;
- if (visited[edge.a - 1])
- {
- new = edge.b - 1;
- visited[new] = true;
- }
- else
- {
- new = edge.a - 1;
- visited[new] = true;
- }
- for (int j = 0; j < vertexes[new].count_edges; ++j)
- edge edge = vertexes[new].adj_list[j];
- if (not vertexes[edge.idx].visited)
- heap.push(edge);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment