//prim算法主要用来计算带权值的最小连通图
#define INF 999999999
int c[105][105]; //定义一个图的矩阵
int flag[105]; //定义一个标记数组,初始化为0,如果已经连通,就标志为1
int prim[105]; //定义一个数组,用来存放每一步的最小值
int n,m; //n表示图有n个节点,有m条边
int sum; //sum表示最小连通的权值和
void Prim()
{
int i,j;
for(i=1;i<=n;i++)
{
prim[i]=c[1][i]; //将与第一个节点连通的权值赋给prim数组,作为prim数组的初值
flag[i]=0; //初始化标记数组为0
}
flag[1]=1; //将第一个节点并入树中,标记为1
int v; //用来一个节点到另一个节点v的最短距离
for(i=1;i<n;i++) //因为有一个节点已经并入树中,因此只要将剩余的n-1个节点并入就行
{
int min=INF;
for(j=1;j<=n;j++) //从prim数组总找到最小值,并且没有并入到树中
{
if(!flag[j]&&prim[j]<min)
{
min=prim[j];
v=j; //记下此节点
}
}
sum+=min; //将此时的最小权值累加到sum
flag[v]=1; //将节点v并入树中,标记为1
for(j=1;j<=n;j++) //将此前到没有并入树中的节点j的权值与节点v到节点j的权值比较
//如果大于,就将v节点到节点j的权值赋给prim[j]
{
if(!flag[j]&&prim[j]>c[v][j])
prim[j]=c[v][j];
}
}
}