今晚刷了一道POJ的最小生成树水题,点击打开题目链接,同时对Prim算法有了更加深入的了解。
我所用的Prim算法如下:
/*==================================================*\
| Prim 求MST
| INIT: cost[][]耗费矩阵(inf为无穷大,表示两个顶点之间不连通,(u,v)不属于E);
| CALL: prim(cost, n); 返回-1代表原图不连通;
\*==================================================*/
#define typec int // type of cost
const typec inf = 0x3f3f3f3f; // max of cost
int vis[V]; typec lowc[V];
typec prim(typec cost[][V], int n){ // vertex: 0 ~ n-1
int i, j, p;
typec minc, res = 0;
memset(vis, 0, sizeof(vis));
vis[0] = 1;
for (i=1; i<n; i++) lowc[i] = cost[0][i];
for (i=1; i<n; i++) {
minc = inf; p = -1;
for (j=0; j<n; j++)
if (0 == vis[j] && minc > lowc[j]) {
minc = lowc[j]; p = j;
}
if (inf == minc) return -1; // 原图不连通
res += minc; vis[p] = 1;
for (j=0; j<n; j++)
if (0 == vis[j] && lowc[j] > cost[p][j])
lowc[j] = cost[p][j];
}
return res; //返回最小权值和
}
cost[][]是权值(暂且认为是边的权值),今天学到了一些知识就是在对cost[][j]赋值方面,如果i==j && cost[i][j] ==0 那么这条边(尽管权值为0,权值>0)不会加入到MST中,但如果i!=j && cost[i][j]==0 ,那么这条边(尽管权值为0,权值>0)则会加入到MST中。
猜想:如果将cost[i][j]的值赋成负值,是不是会在关于最小生成树方面求解更方便呢??