努力ing
你浪费的今天是昨天死去的人所渴望的明天!!!

 

 

//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];
		}
	}

}

  

posted on 2013-05-20 09:40  努力ing  阅读(194)  评论(0)    收藏  举报