最小樹形圖(有向圖的最小生成樹)朱劉演算法
http://baike.baidu.com/view/5944982.htm?fr=aladdin
//======================================================================
//最小樹形圖(有向圖的最小生成樹)朱劉演算法模板
const int N=101,M=10001,inf=2147483647;
struct edge
{
int u,v;
double w;
} e[M];
struct node
{
double x,y;
} p[N];
int n,m,id[N],pre[N],v[N];
double inw[N];
double ans;
void zhu_liu(int root)
{
int s,t,idx=n;
ans=0;
while (idx)
{
for (int i=1; i<=n; ++i) inw[i]=inf,id[i]=-1,v[i]=-1;
for (int i=1; i<=m; ++i)
{
s=e[i].u;
t=e[i].v;
if (e[i].w>inw[t] || s==t) continue;
pre[t]=s;
inw[t]=e[i].w;
}
inw[root]=0;
pre[root]=root;
for (int i=1; i<=n; ++i)
{
if (inw[i]==inf)
{
printf("poor snoopy\n");
return;
}
ans+=inw[i];
}
idx=0;
for (int i=1; i<=n; ++i)
if (v[i]==-1)
{
t=i;
while (v[t]==-1) v[t]=i,t=pre[t];
if (v[t]!=i || t==root) continue;
id[t]=++idx;
for (s=pre[t]; s!=t; s=pre[s]) id[s]=idx;
}
if (idx==0) continue;
for (int i=1; i<=n; ++i)
if (id[i]==-1) id[i]=++idx;
for (int i=1; i<=m; ++i)
{
e[i].w-=inw[e[i].v];
e[i].u=id[e[i].u];
e[i].v=id[e[i].v];
}
n=idx;
root=id[root];
}
printf("%.2lf\n",ans);
}
//==============================================================
相關文章
- 最小樹形圖(朱劉演算法)演算法
- poj 3164 Command Network(最小樹形圖模板題)朱_ 劉演算法演算法
- 演算法-圖論-最小生成樹演算法圖論
- 【圖論】最小生成樹圖論
- 圖論 最小生成樹圖論
- 圖論中的最小生成樹演算法圖論演算法
- Prim 最小生成樹 圖解圖解
- 最小生成樹的演算法演算法
- 最小生成樹
- 圖論之帶權圖「最小生成樹之Prim」圖論
- 最小生成樹__Kurskal演算法演算法
- 最小生成樹__Prim演算法演算法
- Kruskal 最小生成樹演算法演算法
- 圖論之帶權圖「最小生成樹prim的優化」圖論優化
- 最小度限制生成樹
- 【模板】最小生成樹
- 最小生成樹之 Prim 演算法演算法
- 【演算法學習】最小生成樹演算法
- 圖論之帶權圖「最小生成樹prim的最佳化」圖論
- 圖論之帶權圖「最小生成樹(Minimum Span Tree)」圖論
- 演算法與資料結構之帶權圖與圖最小生成樹演算法資料結構
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- 最小生成樹專項
- 【模板】最小生成樹-kruskal
- Matlab生成Kruskal最小生成樹Matlab
- 最小生成樹(MinSpanTree)的Kruskal演算法演算法
- 最小生成樹prim普里姆演算法演算法
- 最小生成樹之普里姆演算法演算法
- Boruvka求最小生成樹(菠蘿演算法)演算法
- 圖論 最小生成樹問題(最優連線問題)圖論
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 演算法 最小高度樹演算法
- 前端必會演算法 - 最小生成樹問題前端演算法
- 最小生成樹學習筆記筆記
- 使用canvas尋路最小生成樹Canvas
- 東哥帶你刷圖論第五期:Kruskal 最小生成樹演算法圖論演算法