题目链接: 畅通工程
void prim(){
dis[1]=0;
while(1){
int minn=INF,k=-1;
for(int i=1;i<=n;i++){
if(dis[i]<minn&&!vis[i]){
minn=dis[i];
k=i;
}
}
if(k==-1) break;
vis[k]=1;
for(int i=1;i<=n;i++){
if(dis[i]>mp[k][i]&&!vis[i]){
dis[i]=mp[k][i];
}
}
}
int ans = 0;
for(int i=1;i<=n;i++){
ans += dis[i];
}
printf("%d\n",ans);
}
这段代码是畅通工程题解的核心,下面对这段代码进行分析
可以看出有三个for循环,最后一个for循环就是一个简单的累加计算,我们主要对前两个进行分析。
第一个for循环是找到dis[]从1到n里最小的值,并让k等于其下标。注意,判断条件有!vis[i],也就是说之前参与过判断的dis[],这一次就不必参与,于是找到的就是最短的路径。
如果说在这轮循环过后k仍然等于-1,那就说明没有符合的路径,也就是所有的村庄都能连接到一起。
vis[i]中的i表示已经连接过的村庄。
对于第二个for循环,是对dis[]进行赋值的操作,之