prime:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#define inf 100000
using namespace std;
const int maxn=100;
int visit[maxn];
int dis[maxn];//记录点与生成树的距离
int g[maxn][maxn];//记录边
int n,m;
int prime(int cur)
{
int sum=0;
visit[cur]=1;
for(int i=1;i<=n;i++)
dis[i]=g[cur][i];
//需要找n-1次
for(int i=1;i<n;i++)
{
int minj=inf;
int temp;
//每次找到距离生成树最近的点
for(int j=1;j<=n;j++)
{
if(!visit[j]&&dis[j]<minj)
{
minj=dis[j];
temp=j;//标记找到的距离生成树最近的点
}
}
visit[temp]=1;//加入生成树
sum+=minj;//记录当前树的权值
for(int j=1;j<=n;j++)//更新距离
{
if(!visit[j]&&dis[j]>g[temp][j])
dis[j]=g[temp][j];
}
}
return sum;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(visit,0,sizeof(visit));//初始化visit全为0
for(int i=1;i<=n;i++)
{
dis[i]=inf;//初始化dis全为inf 即无穷远
for(int j=1;j<=n;j++)
g[i][j]=inf;
}
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;//加边赋值
}
cout<<prime(1)<<endl;
}
}
kruskal:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 250
struct node
{
int x;
int y;
int value;
}edge[6000];
int f[maxn];
bool cmp(node a,node b)
{
return a.value<b.value;
}
int find(int x)
{
//路径压缩
// if(f[x]!=x)
// return f[x]=find(f[x]);
// return f[x];
while(x!=f[x])
x=f[x];
return x;
}
bool combine(int x,int y)
{
int tx=find(x);
int ty=find(y);
if(tx==ty) return false;
f[tx]=ty;
return true;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&n)
{
int num=0;
int sum=0;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].value);
for(int i=1;i<=m;i++)
f[i]=i;
sort(edge+1,edge+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(num==m-1) break;
if(combine(edge[i].x,edge[i].y))
{
printf("选中边%d %d权值%d\n",edge[i].x,edge[i].y,edge[i].value);
num++;
sum+=edge[i].value;
}
}
if(num==m-1) printf("%d\n",sum);
else printf("?\n");
}
}