1.prim
#include<cstdio>
#include<cstring>
#include<iostream>
#define inf 999999999
using namespace std;
int mp[105][105];
bool vis[105];
int dis[105],n,sum;
void prim()
{
int temp,k;
for(int i=1;i<=n;i++)
{
dis[i]=mp[1][i];
vis[i]=0;
}
vis[1]=1;
dis[1]=0;
for(int i=1;i<=n;i++)
{
temp=inf;
for(int j=1;j<=n;j++)
if(!vis[j]&&temp>dis[j])
temp=dis[k=j];
if(temp==inf)
return;
vis[k]=1;
//cout<<"k:"<<k<<endl;
//cout<<"d[k]"<<dis[k]<<endl;
sum=sum+dis[k];
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]>mp[k][j])
dis[j]=mp[k][j];
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
int t;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
mp[a][b]=mp[b][a]=0;
}
sum=0;
prim();
printf("%d\n",sum);
}
return 0;
}
2.kruskal
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,sum,cnt;
int f[105],r[105];
bool vis[105];
struct e
{
int v,u;
int w;
}cl[100*100+10];
bool cmp(e x,e y)
{
return x.w<y.w;
}
void init()
{
for(int i=1;i<=n;i++)
{f[i]=i;r[i]=1;}
return;
}
int findd(int x)
{
while(x!=f[x])
x=f[x];
return x;
}
void kruskal()
{
sum=0;
sort(cl+1,cl+cnt,cmp);
for(int i=1;i<cnt;i++)
{
int x=findd(cl[i].u);
int y=findd(cl[i].v);
if(x==y)
continue;
sum+=cl[i].w;
if(r[x]>=r[y])
{
f[y]=x;
r[x]+=r[y];
}
else
{
f[x]=y;
r[y]+=r[x];
}
}
}
int main()
{
while(~scanf("%d",&n))
{
cnt=1;
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cl[cnt].u=i;
cl[cnt].v=j;
scanf("%d",&cl[cnt].w);
cnt++;
}
int t;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
int x=findd(a);
int y=findd(b);
if(r[x]>=r[y])
{
f[y]=x;
r[x]+=r[y];
}
else
{
f[x]=y;
r[y]+=r[x];
}
}
kruskal();
printf("%d\n",sum);
}
return 0;
}