其实这道题根本没必要写,但为了测试vector+堆优化的Prim试一发。
再次觉得Prim和Dijkstra很像,堆优化版本也差不多。
和Dijkstra一样,Prim也是在之前的dis点中选取一个最短的,但不同是Prim是最短边长,而Dijkstra是到达该点的最短路长度。
既然是取最小的,堆自然就派上用场了。
CODE
#include<cstdio> #include<queue> #include<vector> #include<cstring> using namespace std; const int N=105; struct data { int x,num; bool operator <(const data a) const { return a.x<x; } }; priority_queue<data> tree; vector <int> a[N],l[N]; int n,dis[N],ans,i,j,x; bool f[N]; inline void read(int &x) { x=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); } int main() { memset(dis,63,sizeof(dis)); read(n); for (i=1;i<=n;++i) for (j=1;j<=n;++j) { read(x); if (i!=j) { a[i].push_back(j); l[i].push_back(x); } } dis[1]=0; tree.push((data){0,1}); while (!tree.empty()) { int k=tree.top().num; tree.pop(); if (f[k]) continue; f[k]=1; ans+=dis[k]; for (i=0;i<a[k].size();++i) { int now=a[k][i]; if (dis[now]>l[k][i]) { dis[now]=l[k][i]; tree.push((data){dis[now],now}); } } } printf("%d",ans); return 0; }