题目链接:https://vjudge.net/contest/351234#problem/I
题目描述:给出点和各边的距离,计算最小生成树。
题目分析:这题是典型算最小生成树的题。笔者准备用prim和kruskal做一次。用prim时超时,决定优先队列优化(后来发现只是卡bug超时)实践证明,优化优的不好,会起反效果的。用prim这里卡了一个n=1的bug(以后除了0和上限还要考虑1)。
代码1(prim):
#include <stdio.h>
#include <stdlib.h>
int cost[101][101],b[101],c[101],n,m,sum,k;//cost[]用来存图
void f(int x) //b[]c[]用来记录以走路段
{
int i,min,t=0,j;
b[k++]=x; //记路
c[x]=0; //记路
for(j=0,min=2e9;j<k;j++) //这个双循环用来找不成环最段路径
{
for(i=1;i<=n;i++)
{
if(c[i]&&cost[b[j]][i]<min) {
t=i;min=cost[b[j]][i];} //更新
}
}
sum+=min;
if(k==n-1) return; //控制深度
f(t);
}
int main()
{
int i,u,w,v;
while(scanf("%d",&n)!=EOF&&n)
{
sum=0; //重置
k=0;
if(n==1) goto loop; //如果不考虑n=1,那么会出现死循环
m=n*(n-1)/2;
for(i=1;i