#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=6000;
int n;
int mapp[maxn][maxn];
struct node
{
int x,y,value;
}edge[maxn];
int fa[maxn];
bool cmp(const node a,const node b)
{
return a.value<b.value;
}
int find(int x)
{
return x==fa[x]?x:find(fa[x]);
}
int main()
{
int i,j;
int m;
int a,b;
while(cin>>n)
{
for(i=1;i<=n;i++)
fa[i]=i;
int k=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
int num;
cin>>num;
if(i>=j)
continue;
edge[k].x=i;
edge[k].y=j;
// int num;
edge[k].value=num;
k++;
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>a>>b;
int a1=find(a);
int b1=find(b);
fa[a1]=b1;
}
sort(edge,edge+k,cmp);
int ans=0;
for(i=0;i<k;i++)
{
int x1=find(edge[i].x);
int x2=find(edge[i].y);
if(x1!=x2)
{
ans+=edge[i].value;
fa[x1]=x2;
}
}
cout<<ans<<endl;
}
}
这个是转的
#include<stdio.h>
#define MAX 99999999
int n,q,ans;
int road[105][105],visited[105],dis[105];
void Prim(){
int i;
for(i=1;i<=n;i++){
dis[i]=road[1][i];
visited[i]=0;
}
visited[1]=1;
dis[1]=0;
int j,k,tmp;
for(i=1;i<=n;i++){
tmp=MAX;
for(j=1;j<=n;j++)
if(!visited[j] && tmp>dis[j]){
k=j;
tmp=dis[j];
}
if(tmp==MAX)
break;
visited[k]=1;
ans+=dis[k];
for(j=1;j<=n;j++)
if(!visited[j] && dis[j]>road[k][j])
dis[j]=road[k][j];
}
}
int main(){
while(scanf("%d",&n)!=EOF){
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&road[i][j]);
scanf("%d",&q);
int a,b;
for(i=0;i<q;i++){
scanf("%d%d",&a,&b);
road[a][b]=road[b][a]=0;
}
ans=0;
Prim();
printf("%d\n",ans);
}
return 0;
}