1) prim算法
对点进行贪心操作。(适合稠密图)
const int M =1005;
int vis[M]; //表示该i点是否被选择 vis[i]=0 还未被选择
int map[M][M]; //map[i][j] 表示i到j的距离
int dis[M]; // 1到i的距离和
void prim(){
memset(vis,0,sizeof(vis)) ;
for(int i=1;i<=n;i++)
dis[i] = map[1][i] ;
int minn=0x3f3f3f3f;
int flag=1;
int sum=0;
for(int k=1;k<=n;k++) {
minn=0x3f3f3f3f;
flag=1;
for(int i=1;i<=n;i++) {
if(!vis[i]&&dis[i]<minn) {
minn=dis[i] ;
flag=i;
}
}
vis[flag] = 1;
sum+=dis[flag];
for(int i=1;i<=n;i++) {
if(!vis[i]&&dis[i]>map[flag][i])
dis[i] = map[flag][i] ;
}
}
cout << sum<<endl;
}
2)kruskal算法
对边进行贪心操作。(稀疏图)
using namespace std;
struct node{
int u,v,w;
}p[10005];
int pre[10005] ;
int cnt=0;
void init(int n) {
for(int i=1;i<=n;i++) {
pre[i]=i;
}
}
int find(int x){
while(x!=pre[x])
x=pre[x] ;
return x;
}
//void join(node s) {
// int x=find(s.u) ;
// int y=find(s.v) ;
// if(x!=y) {
// pre[y]=x;
// }
//}
int cmp(node x,node y){
return x.w<y.w;
}
int n,r;
void kruskal() {
sort(p,p+cnt,cmp) ;
init(n);
int res=0;
for(int i=0;i<cnt;i++) {
node s = p[i] ;
int x=find(s.u);
int y=find(s.v) ;
if(x!=y) {
pre[y]=x;
res+=s.w;
}
}
printf("%d\n",res) ;
}