演算法描述:
從t=null開始
for (圖中的每條邊e)
if(加入e不構成環,則t=t+e)
else e'是環上權重最大的邊,t=t+e-e『
演算法實現
可以看出上述的演算法的關鍵之處就在於判斷圖中是否存在環以及找到環中最大的邊。
判斷是否有環:
用dfs深度優先搜尋,如果搜尋過程中發現乙個點u的鄰接點v是灰色的,則說明這條邊(u,v)是後向邊。
找到環中最大邊:
從u開始尋找他的前驅點π[u],直到前驅點為v時停止,這過程中的所有點就是環中的所有的點。然後再求出最大的邊就好了。
int linkeddgraph1::dfscircle(int *res)
for (int i = 0; i < verticenumber; i++)
uu = point1;
point1 = precursor[point1];
}int temp = getweight(point1, uu);
if (maxweight < temp)
break;
}} }
return maxweight;
}void linkeddgraph1::dfscirclevisit(int u,bool &exist,int &uu,int &vv)
if (color[v] == gray)//如果點是灰色的,說明有後向邊即構成環
} p = p->next;
} color[u] = black;
time += 1;
ftime[u] = time;
}
最後的生成樹的**:
void linkeddgraph1::lsmst(linkeddgraph1 &g1)
p = p->next;
} }}
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...
最小生成樹演算法
乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...
演算法 最小生成樹
前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...