基本思想:
prim是求最短生成树的一种算法,其基本思想是设置是v集合与s-v集合,v集合里是已经确定了的点,从s-v集合中选取距离v集合最短的点,加入v集合,重复这一过程直到结束
如图;
1.初始化将起点到起点距离设为0,其余设为无穷大;这里将1-1距离设为0;
2.将1点放入v数组里其余放入s-v数组里
3找到距离v数组距离最近的这里是4点(距离是2);
3.然后找到距离数组最短的2点(距离是2);
4.重复以上过程n-1次最后会得到最小生成树,
这个过程与dj相似只不过dj是找距离起点最近的,而prim是找距离集合最近的;
代码
#include<bits/stdc++.h>
using namespace std;
const int mxv=0x3f3f3f3f;
const int mxn=100;
struct node{
int from,id,w;
node(){
}
node(int arfrom,int arid,int arw){
from=arfrom;
id=arid;
w=arw;
}
friend bool operator < (node a,node b){
return a.w>b.w;
}
};
int n,e,g[mxn+9][mxn+9],n1,n2,w;
bool flag[mxn+9];
priority_queue<node>pque;
vector<node> prim(int sid){
vector<node>result;
memset(flag,false,sizeof(flag));
pque.push(node(-1,sid,0));
while(result.size()<n-1){
node nd=pque.top();pque.pop();
if(flag[nd.id])continue;
flag[nd.id]=true;
if(nd.id!=1)result.push_back(nd);
for(int i=1;i<=n;i++){
if(!flag[i]&&g[nd.id][i]<mxv){
pque.push(node(nd.id,i,g[nd.id][i]));
}
}
}
return result;
}
int main(){
memset(g,0x3f,sizeof(g));
cin>>n>>e;
for(int k=1;k<=e;k++){
cin>>n1>>n2>>w;
g[n1][n2]=w;
g[n2][n1]=w;
}
//i=1;
vector<node>nodes=prim(1);
for(int i=0;i<nodes.size();i++){
cout<<nodes[i].from<<" "<<nodes[i].id<<endl;
}
return 0;
}