1、MST任意两点路径上的最长边
这其实是在求次小生成树 , 因为我们可以知道 , 次小生成树和最小生成树之间只有一条边不一样 , 因此我们只需要枚举不在最小生成树中边 , 同时我也要求出该两点在最小生成树中之间的路径中的最长边的值。
解法:我们用kruskal算法来求出最小生成树 , 对于kruskal算法 , 当我们要加入一条边时 , 实际上是在把两颗“树”合并 , 那么从这两颗树上各去除一个点 , 则这两点路径之间的最大边 , 就是当前加入的这条边,因此我们只需要记录每颗树就行了 , 对于每颗树我们可以用邻接表(数组模拟)来存 。
代码:
int kruskal()
{
sort(edge , edge+m , cmp); //对边进行排序
int i , x , y , g , h , k = 0;
int sum = 0;
for(i = 0; i < n; i++) //先把每个点都看成是一颗树
{
link[i].x = i+1;
link[i].next = head[i+1];
end[i+1] = i;
head[i+1] = i;
}
for(i = 0; ; i++)
{
if(k == n-1)
break;
x = find(edge[i].x); // 判断这两个点是不是在同一颗树上
y = find(edge[i].y);
if(x != y)
{
解法:我们用kruskal算法来求出最小生成树 , 对于kruskal算法 , 当我们要加入一条边时 , 实际上是在把两颗“树”合并 , 那么从这两颗树上各去除一个点 , 则这两点路径之间的最大边 , 就是当前加入的这条边,因此我们只需要记录每颗树就行了 , 对于每颗树我们可以用邻接表(数组模拟)来存 。
代码:
int kruskal()
{