求次小的生成樹即求第二小的生成樹,次小生成樹可由最小生成樹換一條邊得到,一般採用的是求出最小生成樹後,依次刪除最小生成樹上的每一條邊,然後生成n-1個最小生成樹,記錄下這個過程中的最小生成樹的值,那麼這個就是第二小生成樹了,用kruskal這種演算法的複雜度為o(n*elog2e),當圖比較稠密時,複雜度接近o(n^3)
次小生成樹用kruskal的第一種方法
#includeusing namespace std;
int n,m;
struct data
p[20010];
vectorg[110];
int father[110],len[110][110];
const int oo=1e9;
bool cmp(data a,data b)
int main()
sides[maxn];
bool flag[maxn];
int sett[maxn];
int cmp(data a,data b)
for(i=2; i<=n; i++) //prim
}return res;
}int main()
ans=prim();//最小生成樹的權值
for(i=1; i<=n; i++)
if(ans1==ans)
}if(!ok)
break;
}printf("ans=%d ans1=%d\n",ans,ans1);
}return 0;
}
次小生成樹 prim和kruskal
prim 先用prim求出最小生成樹t,在prim的同時,用乙個矩陣maxd u v 記錄 在t中鏈結任意兩點u,v的唯一的路中權值最大的那條邊的權值,這是很容易做到的,因為prim是每次增加乙個結點s,在此需要儲存節點和其父節點,採用dp,則最大權值要麼是新加入的邊,要麼是父節點到起始點的採用dp...
kruskal 最小生成樹
include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...
最小生成樹Kruskal
最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...