给一个邻接矩阵求最小生成树的权值。
最简单的prim就行,但我写了加堆优化的prim。以提高效率。
/* ID: modengd1 PROG: agrinet LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <queue> using namespace std; int N; int input[100][100]; struct node { int E,W; node(int ee,int ww) { E=ee;W=ww; } node(){} bool friend operator<(node n1,node n2) { return n1.W>n2.W; } }; void prim() { int dist[100];//未加入的点离当前已生成的最小生成树的最近的距离,次数足可以不要,加上以后可以优化队列大小 bool vis[100];//i点是否已经加入当前最小生成树 int ans=0; priority_queue<node> Q; memset(vis,false,sizeof(vis)); memset(dist,0x7f,sizeof(dist)); Q.push(node(0,0));//加入第一个点 while(!Q.empty()) { node now=Q.top(); Q.pop(); if(!vis[now.E])//此点未加入 { ans+=now.W;//更新当前已生成的最小生成树 vis[now.E]=true; for(int i=0;i<N;i++)//检查从此点连出的边是否会更新未加入的点离已生成的树的距离 { if(vis[i]) //从此点伸出的边相连的点已经在当前生成树中了 continue; if(dist[i]<input[now.E][i])//从此点伸出的边到达未加入的点的距离大于以前加入的 continue; dist[i]=input[now.E][i]; Q.push(node(i,input[now.E][i])); } } } cout<<ans<<endl; } int main() { freopen("agrinet.in","r",stdin); freopen("agrinet.out","w",stdout); scanf("%d",&N); for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { scanf("%d",&input[i][j]); } } prim(); return 0; }
时间: 2024-10-03 20:50:20