1.Kruskal
#include <iostream>
#include <cmath>
#include <cstdio>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
struct edge
{
int from,to,weight;
}e[100];
int par[30];
bool cmp(edge a,edge b)
{
return a.weight<b.weight;
}
int find(int x)
{
return par[x]==x?x:par[x]=find(par[x]);
}
int main()
{
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
}
int cnt=0,ans=0;
for(int i=1;i<n;i++)
{
int weight,num;
char start,end;
cin>>start>>num;
for(int j=0;j<num;j++,cnt++)
{
cin>>end>>weight;
e[cnt].from=start-'A';
e[cnt].to=end-'A';
e[cnt].weight=weight;
}
}
sort(e,e+cnt,cmp);
for(int i=0;i<cnt;i++)
{
int x=find(e[i].from);
int y=find(e[i].to);
if(x!=y)
{
ans+=e[i].weight;
par[y]=x;
}
}
cout<<ans<<endl;
}
system("pause");
return 0;
}
2.Prim
#include <bits/stdc++.h>
using namespace std;
const double inf=9999999;
int n;
double x[100],y[100];
double edge[100][100];
double temp;
int vis[100];
double dis[100];
int nike,apple;
void prim()
{
int v;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
dis[i]=edge[1][i];
}
double sum=temp;
double mi;
vis[1]=1;
for(int i=1;i<n;i++)
{
mi=inf;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&mi>dis[j])
{
v=j;
mi=dis[j];
}
}
vis[v]=1;
sum+=dis[v];
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>edge[v][j])
{
dis[j]=edge[v][j];
}
}
}
printf("%.2lf\n",sum);
}
int main()
{
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
edge[i][j]=inf;
edge[i][i]=0;
}
scanf("%d%d",&nike,&apple);
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
edge[i][j]=edge[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
}
temp=edge[nike][apple];
edge[nike][apple]=edge[apple][nike]=0;
prim();
}
//system("pause");
return 0;
}