一、预备知识
二、代码:
#include<iostream>
#include<list>
#include<vector>
#include<map>
#include<queue>
#define INF 9999999
using namespace std;
class Graph
{
int n;
list< pair<int,double> >*adj;
public:
Graph(int _n)
{
this->n = _n;
adj = new list<pair<int,double> >[_n];
}
void addEdge(int u, int v, double weight)
{
adj[u].push_back(make_pair(v, weight));
adj[v].push_back(make_pair(u, weight));
}
void primMST();
};
void Graph::primMST()
{
priority_queue< pair<double,int>,
vector<pair<double,int> >,
greater<pair<double,int> > > pq;
vector<int>key(n,INF);
vector<int> parent(n,-1);
vector<bool>inMST(n,false);
int src=0;
key[src] = 0;
pq.push(make_pair(0,src));
while(!pq.empty())
{
int u = pq.top().second;
pq.pop();
inMST[u] = true;
list<pair<int,double> >::iterator it;
for(it = adj[u].begin(); it != adj[u].end(); it++)
{
int v = (*it).first;
double weight = (*it).second;
if(inMST[v] == false && key[v] > weight)
{
key[v] = weight;
pq.push(make_pair(key[v],v));
parent[v] = u;
}
}
}
for(int i = 1 ;i < n; i++)
{
cout<<parent[i]<<"->"<<i<<" weight is "<<key[i]<<endl;
}
}
int main()
{
int V = 9;
Graph g(V);
g.addEdge(0, 1, 4);
g.addEdge(0, 7, 8);
g.addEdge(1, 2, 8);
g.addEdge(1, 7, 11);
g.addEdge(2, 3, 7);
g.addEdge(2, 8, 2);
g.addEdge(2, 5, 4);
g.addEdge(3, 4, 9);
g.addEdge(3, 5, 14);
g.addEdge(4, 5, 10);
g.addEdge(5, 6, 2);
g.addEdge(6, 7, 1);
g.addEdge(6, 8, 6);
g.addEdge(7, 8, 7);
g.primMST();
return 0;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3dbfbecab36854bd15b750e32462b8b6.png)