樹形圖:
最小樹形圖問題:找出總邊權和最小的樹形圖
朱劉演算法解決最小樹形圖問題。
對於除根外每個點,找出該點入邊中權值最小的邊,把權加到答案中。
判斷選出的邊是否存在環。若無環,退出,找到最小樹形圖,若有環,繼續執行步驟 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等級。要你求 將所有課程等級過完的最小花費。思路 將每門課的每個等級看成乙個點,每個點都在圖中,每個點只...