→题目链接←
令人一看样例就不想做的题...
题面说的很麻烦..但是仔细想一想就是问一个点到其它点距离的和的最小值
用并查集将岛屿处理出来
将每个岛屿看作一个点
然后一边输入就能一边处理出岛屿间的距离
最后暴力求和取min就好
代码:
#include<iostream>
#include<cstdio>
#define inf 233333333
using namespace std;
int n;
int len[505][505];
int fa[505],a[505];
int num=0,ans=inf;
int getroot(int x){
if(x==fa[x])return x;
return fa[x]=getroot(fa[x]);
}
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++)fa[i]=i;
for(int i=1; i<=n; i++){
int x,y;
scanf("%d%d",&x,&y);
x=getroot(x);
y=getroot(y);
if(x!=y)fa[x]=y;
}
for(int i=1; i<=n; i++)if(fa[i]==i)a[i]=num++;
for(int i=1; i<=n; i++)a[i]=a[getroot(i)];
for(int i=0; i<num; i++)for(int j=0; j<num; j++)len[i][j]=inf;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
int x;
scanf("%d",&x);
len[a[i]][a[j]]=min(len[a[i]][a[j]],x);
}
}
for(int i=0; i<num; i++){
int sum=0;
for(int j=0; j<num; j++)sum+=len[i][j];
ans=min(ans,sum);
}
printf("%d\n",ans*2);
return 0;
}