1.prim算法实现:
**AC代码:**
#include<stdio.h>
#include<string.h>
#define Nmax 501
#define inf 0x3f3f3f3f
int map[Nmax][Nmax];
int prim(int v){
/*low[j]记录以j为终点的边的最小值
且边的起点是存在于已访问点集
*/
int low[Nmax];
int min,mid,i,j,sum;
sum=0;
for(i=2;i<=v;i++)
low[i]=map[1][i];
for(i=2;i<=v;i++){
min=inf;
mid=0;
/*
*/
for(j=2;j<=v;j++){
if(low[j]<min&&low[j]!=0){
min=low[j];
mid=j;
}
}
sum+=min;
/*low[j]也承担vis[j]的功能,指示j点是否已访问,访问过置0
*/
low[mid]=0;
/*更新low[j],使low[j]是已访问点到j的距离中最小的
每新加一个点,就把这个点到j的距离与以前的low[j]比较,始终保持low[j]的最小
*/
for(j=2;j<=v;j++){
if(map[mid][j]<low[j]){
low[j]=map[mid][j];
}
}
}
return sum;
}
int main(){
int v,e,T,i,j,a,b,c;
scanf("%d",&T);
while(T--){
scanf("%d%d",&v,&e);
memset(map,inf,sizeof(map));
for(i=1;i<=e;i++){
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
c=inf;
for(i=1;i<=v;i++){
scanf("%d",&a);
if(a<c) c=a;
}
printf("%d\n",c+prim(v));
}
return 0;
}
2.克鲁斯卡尔算法实现:
**AC代码:**
#include<stdio.h>
#include<stdlib.h>
#define Nmax 124755
typedef struct{
int x,y,w;
}edg;
edg ed[Nmax];
int rank[Nmax],father[Nmax];
int sum;
int cmp(const void*a,const void*b){
return ((edg*)a)->w-((edg*)b)->w;
}
void Make_set(int i){
father[i]=i;
rank[i]=0;
}
int Find_set(int i){
if(father[i]!=i){
return Find_set(father[i]);
}
return father[i];
}
void Union_set(int x,int y,int w){
if(x==y)
return ;
if(rank[x]>rank[y]) father[y]=x;
else{
if(rank[x]==rank[y]) rank[y]++;
father[x]=y;
}
sum+=w;
}
int main(){
int T,v,e,i,m,a;
scanf("%d",&T);
while(T--){
sum=0;
m=120;
scanf("%d%d",&v,&e);
for(i=1;i<=v;i++)
Make_set(i);
for(i=1;i<=e;i++){
scanf("%d%d%d",&ed[i].x,&ed[i].y,&ed[i].w);
}
for(i=1;i<=v;i++){
scanf("%d",&a);
if(a<m) m=a;
}
qsort(ed,e+1,sizeof(ed[1]),cmp);
for(i=1;i<=e;i++){
int x=Find_set(ed[i].x);
int y=Find_set(ed[i].y);
Union_set(x,y,ed[i].w);
}
printf("%d\n",sum+m);
}
return 0;
}