一共有三个 最后一个还没学
实际上相当于贪心 每次都找最小的且没选过的一个
1.prim 是以点为中心选的边;
#include <iostream>
#include<string.h>
#include<stdlib.h>#include<stdio.h>
#include<math.h>
#define MAX 100
using namespace std;
int low[MAX],wath[MAX][MAX],bj[MAX],ll[MAX];
const int INF=0x3f3f3f3f;
int prim(int n)
{
int a,b,c,i,j,k,min1,sum=0,p;
memset(bj,0,sizeof(bj));
memset(ll,0,sizeof(ll));
memset(low,0x3f3f3f3f,sizeof(low));
bj[1]=1;
ll[1]=1;
for(i=2;i<=n;i++)
{
if((wath[1][i]<low[i]&&wath[1][i]!=-1)&&(!bj[i]))
{
low[i]=wath[1][i];
}
}
for(j=2;j<=n;j++)
{
min1=INF;
p=-1;
for(i=1;i<=n;i++)
if(min1>low[i]&&(!bj[i]))
{
min1=low[i];
p=i;
}
if(p==-1)
return -1;
sum+=low[p];
for(i=1;i<=n;i++)
{
if((wath[p][i]<low[i]&&wath[p][i]!=-1)&&(!bj[i]))
{
low[i]=wath[p][i];
}
}
bj[p]=1;
ll[j]=p;
printf("%d %d %d\n",ll[j-1],ll[j],min1);
}
return sum;
}
int main()
{
int a,b,c,j,n,i,k,m;
memset(wath,-1,sizeof(wath));
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
wath[a][b]=c;
wath[b][a]=c;
}
printf("%d\n",prim(n));
return 0;
}
2Kruskal; 相当于是以边为中心 通过把各个点连接起来来实现最后所有点都能相连才 需要用到并查集 来确定两点是否在一个集合内
#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#define MAX 100
#include<algorithm>
using namespace std;
struct qwe{
int a,b,lod;
}ll[MAX],wath[MAX];
int low[MAX],bj[MAX];
const int INF=0x3f3f3f3f;
int qwe1(int a)
{
int b,c,i,j,k;
i=b=a;
while(bj[a]!=a)
{
a=bj[a];
}
while(i!=a)
{
j=bj[i];
bj[i]=a;
i=j;
}
return a;
}
void qwe2(int a,int b)
{
int e,f;
e=qwe1(a);
f=qwe1(b);
if(e!=f)
if(e>f)
bj[e]=f;
else
bj[f]=e;
}
int kruskal(int n,int m)
{
int a,b,c,i,j,k,min1,sum=0,p;
for(i=1;i<=n;i++)
bj[i]=i;
memset(ll,0,sizeof(ll));
memset(low,0,sizeof(low));
for(j=0;j<m;j++)
{
if(qwe1(wath[j].a)!=qwe1(wath[j].b))
{
qwe2(wath[j].a,wath[j].b);
sum+=wath[j].lod;
printf("%d %d %d\n",wath[j].a,wath[j].b,wath[j].lod);
}
}
return sum;
}
bool cmp(struct qwe a,struct qwe b)
{
return a.lod<b.lod;
}
int main()
{
int a,b,c,j,n,i,k,m;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&wath[i].a,&wath[i].b,&wath[i].lod);
}
sort(wath,wath+m,cmp);
for(i=0;i<m;i++)
printf("%d %d %d\n",wath[i].a,wath[i].b,wath[i].lod);
printf("%d\n",kruskal(n,m));
return 0;
}
3Borurm; ....暂时还没学 敬请期待