prim最小生成树
#include<bits/stdc++.h> using namespace std; int n,m; const int INF=0x3f3f3f3f; const int MAXN=110; bool vis[MAXN]; int lowc[MAXN]; int tu[MAXN][MAXN]; int prim(int cost[][MAXN]) { memset(vis,false,sizeof(vis)); vis[1]=true; int ans=0; for(int i=2;i<=n;i++)lowc[i]=cost[1][i]; for(int i=2;i<=n;i++) { int minc=INF; int p=-1; for(int j=1;j<=n;j++) { if(!vis[j]&&minc>lowc[j]) { minc=lowc[j]; p=j; } } if(minc==INF)return -1;//不满足最小生成树要求 ans+=minc; vis[p]=true; for(int j=1;j<=n;j++) { if(!vis[j]&&lowc[j]>cost[p][j]) lowc[j]=cost[p][j]; } } return ans; } int main() { memset(tu,INF,sizeof(tu)); cin>>n;//输入点的数量; cin>>m;//输入边的数量; for(int i=1;i<=m;i++) { int temp1,temp2,quan; cin>>temp1>>temp2>>quan;//输入 起点与终点序号 以及 权值 tu[temp1][temp2]=quan; tu[temp2][temp1]=quan;//建图 并且是无向图 } int ans1=prim(tu); cout<<"最小生成树:"<<ans1<<endl; }
rush!