在挑战程序设计竞赛那本书上看prim代码,总感觉别扭,而我又不喜欢那种代码方式,比较喜欢dijstra采用优先队列的顺序,所以就自己写了一个用优先队列的prim算法,用于日后使用。
贴代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <utility>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
int N,M;//N个点,M个边
const int V_MAX = 100;
const int INF = 1<<31 - 1;
typedef struct edge
{
int to, cost;
edge(int a, int b){
to = a;
cost = b;
}
}edge;
typedef pair<int ,int> P;
vector<edge > G[V_MAX];
int used[V_MAX];
int prim()
{
int sum = 0;
priority_queue<P, vector<P>, greater<P> > pque;
pque.push(P(0,1));
while(!pque.empty())
{
P temp = pque.top();
pque.pop();
int V = temp.second;
int cos = temp.first;
if(used[V])continue;
sum += cos;
used[V] = 1;
for(int i=0; i<G[V].size(); i++)
{
edge e = G[V][i];
pque.push(P(e.cost, e.to));
}
}
return sum;
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=0; i<M; i++)
{
int fir,sec,thi;
scanf("%d%d%d",&fir, &sec, &thi);
G[fir].push_back(edge(sec,thi));
G[sec].push_back(edge(fir,thi));
}
cout << prim() << endl;
}
该代码,仅测一份数据,且点的最大数为99