题目描述:
题目大意就是找到每一个点的最近祖先,同时规定1号点是总祖先
思路:
对于1号点,我们可以辐射与之关联的点,并从中找到最短边,将此边与之相连的点归入到答案中
这是什么?!?---->prim板子思路啊 ——
找到一个点后激活与之相连的边,同时将其他未归入答案集的点相连的边更新(更新边的长度时别忘了更新最近祖先)
Code
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,c[N][N],fa[N],dis[N];
bool vis[N];
int main(){
memset(dis,0x3f3f3f3f,sizeof(dis));
dis[1]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&c[i][j]);
}
}
for(int i=1;i<=n;i++){
int k,minn=1e9;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]<minn){
k=j;
minn=dis[j];
}
}
vis[k]=true;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>c[k][j]){
fa[j]=k;
dis[j]=c[k][j];
}
}
}
for(int i=2;i<=n;i++) printf("%d\n",fa[i]);
return 0;
}