emmmmm.....51基础题别的不说(赤裸裸的prim算法),就是用于最小生成树算法入门的,主要是prim算法。
先随便选一个点加入集合v,然后在非v集合中不断找到这个集合
距离最小的点,之后把该点加入集合v并更新非v集合的点到集合v的最小的距离(既然有新点加入,那么非v集合中各点到v集合的的最小距离也要更新啦),再把最小距离加入cost ,最后重复以上操作直到把所有点加入v集合就可以啦。(是不是感觉很像贪心,没错,实际上......它就是贪心)。
#include<bits/stdc++.h>
using namespace std;
int d[1005][1005],n,m,s,e,w,v[1005],lowcost[1005];
#define inf 0x3f3f3f3f
int prim(int n,int m){
int i,j,begin,Min;
int cost=0;
begin=1;
v[1]=1;
for(i=1;i<=n;i++) lowcost[i]=d[begin][i];
for(i=1;i<n;i++){
Min=inf;
int k=0;
for(j=1;j<=n;j++){
if(!v[j]&&Min>lowcost[j])
{
Min=lowcost[j];
k=j;
}
}
cost+=Min;
v[k]=1;
begin=k;
for(j=1;j<=n;j++){
if(!v[j]&&d[begin][j]<lowcost[j])
lowcost[j]=d[begin][j];
}
}
return cost;
}
int main(){
int i,j;
cin>>n>>m;
fill(v,v+1005,0);
memset(d,0x3f,sizeof(d));
for(i=0;i<m;i++){
cin>>s>>e>>w;
d[s][e]=d[e][s]=w;
}
cout<<prim(n,m)<<endl;
return 0;
}
怎么样入门很合适吧。新人写博,有错望指出哦。