这道题当我们将邻接矩阵转化点到点的距离后,这就是一个裸的kruskal
那么我就说说怎么转化
我们都知道邻接矩阵是关于对角线对称的,所以我们只需要处理某半个部分就行
例如a[i][j]=???
就表示i这个点到j的距离为???,因为是无向图,所以加一次就行
时间复杂度
参考文献
y总的基础课+自己yy
C++ 代码
#include<iostream>
#include <algorithm>
using namespace std;
const int M=3e5;
int res=0;
int n,m;
const int N=1e3;
int a[N][N];
struct node{
int a,b,w;
bool operator <(const node W)const
{
return w<W.w;
}
}e[M];
int fa[M];
int find(int x)
{
if(x==fa[x])
return fa[x];
return fa[x]=find(fa[x]);
}
int kruskal()
{
int cnt=0;
sort(e+1,e+1+m);
for(int i=1;i<=m;i++)
{
int a=e[i].a;
int b=e[i].b;
if(find(a)!=find(b))
{
fa[find(a)]=find(b);
res+=e[i].w;
cnt++;
}
if(cnt==n-1)
return 1;
}
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(a[i][j]>0)
e[++m]={i,j,a[i][j]};
}
kruskal();
cout<<res<<endl;
return 0;
}