學習筆記 朱劉演算法

2022-04-29 05:51:10 字數 2239 閱讀 7670

樹形圖:

最小樹形圖問題:找出總邊權和最小的樹形圖

朱劉演算法解決最小樹形圖問題。

對於除根外每個點,找出該點入邊中權值最小的邊,把權加到答案中。

判斷選出的邊是否存在環。若無環,退出,找到最小樹形圖,若有環,繼續執行步驟 3。

將所有環縮點,構造乙個新圖,對於舊圖的每條邊:

對於每個環而言,至少去掉一條邊。

對於每個環而言,必然存在乙個最優解,只去一條邊(若選了兩條,那麼把其中一條邊選回環上,答案不

會變差)。

演算法即在滿足1、2性質的所有樹形圖中求最優解。

選改動過的權值,若當前邊 = 該終點當前選的邊,那麼權值換為 \(0\),相當於標記已經選完;否則,選這條邊相當於改變乙個點的入邊,可以對映到左邊的乙個樹形圖。

從某種角度上來說,朱劉演算法就是帶後悔的貪心。

\(o(nm)\),每次迭代一次點數至少會 \(-1\)。

\(n\) 是點數,\(m\) 是邊數,\(e\) 結構體陣列是每條邊 \((u, v, w)\),\(ans\) 是答案。

\(in\) 是每個點入邊邊權,\(pre\) 是每個點入邊的起點編號,\(id\) 是縮點後的編號,\(vis\) 是找環輔助陣列。

找環:

double inline edmonds() 

} if (!col) break;

for (int i = 1; i <= n; i++) if (!id[i]) id[i] = ++col;

int tot = 0;

for (int i = 1; i <= m; i++) ;

} m = tot, n = col, rt = id[rt];

} return ans;

}

acwing 2417. 指揮網路

#include #include #include #include using namespace std;

typedef long long ll;

const int n = 105, m = 10005;

const double inf = 1e100;

int n, m, rt = 1, x[n], y[n], col;

double in[n];

int vis[n], id[n], pre[n];

struct e e[m];

double inline edmonds()

} if (!col) break;

for (int i = 1; i <= n; i++) if (!id[i]) id[i] = ++col;

int tot = 0;

for (int i = 1; i <= m; i++) ;

} m = tot, n = col, rt = id[rt];

} return ans;

}int main() ;

} m = tot;

double res = edmonds();

if (res == -1) puts("poor snoopy");

else printf("%.2f\n", res);

} return 0;

}

落谷 p4716 【模板】最小樹形圖

#include #include #include using namespace std;

typedef long long ll;

const int n = 105, m = 10005, inf = 1e9;

int n, m, rt = 1, x[n], y[n], col, in[n];

int vis[n], id[n], pre[n];

struct e e[m];

int inline edmonds()

} if (!col) break;

for (int i = 1; i <= n; i++) if (!id[i]) id[i] = ++col;

int tot = 0;

for (int i = 1; i <= m; i++) ;

} m = tot, n = col, rt = id[rt];

} return ans;

}int main() ;

} m = tot;

printf("%d\n", edmonds());

return 0;

}

F Teen Girl Squad 朱劉演算法

f teen girl squad 題目主要是最小樹形圖,用朱劉演算法求解。include include include include using namespace std const int inf 0x3f3f3f3f const int maxn 1005 struct nede edg...

學習乙個朱劉演算法

什麼是最小樹形圖?相信大家如果會過來看這篇文章,想必也應該對最小生成樹有所了解的,最小生成樹求的是無向圖的一顆生成樹的最小權值。我們的最小樹形圖就是來解決乙個有向圖的一顆生成樹的最小權值,對於度娘來說,最小樹形圖是這樣定義的 最小樹形圖,就是給有向帶權圖中指定乙個特殊的點root,求一棵以root為...

hdu4966 朱劉演算法

題意 輸入n門課,m條路,然後n個整數,表示這n門課要修到的最高等級,m行路每行5個數 a d1 b d2 x 表示的意思是從要花x元錢直接公升級到 b門課的d2等級的前提 是你的a課 要到打d1等級。要你求 將所有課程等級過完的最小花費。思路 將每門課的每個等級看成乙個點,每個點都在圖中,每個點只...