/*
朱刘算法, 复杂度O(VE),
源点不能到达其他点返回-1;
*/
int n, m;
int A[M], B[M], C[M];
int in[N], pre[N], id[N], vis[N];
int DMST(int s, int n) {
int ret = 0;
while(1) {
for(int i = 1; i <= n; ++i) in[i] = inf;
for(int i = 1; i <= m; ++i) {
if(A[i] != B[i] && C[i] < in[B[i]])
in[B[i]] = C[i], pre[B[i]] = A[i];
}
in[s] = 0;
for(int i = 1; i <= n; ++i) if(in[i] == inf) return -1;
for(int i = 1; i <= n; ++i) vis[i] = id[i] = -1;
int cnt = 0;
for(int i = 1; i <= n; ++i) {
ret += in[i];
int v = i;
while(vis[v] != i && id[v] == -1 && v != s)
vis[v] = i, v = pre[v];
if(id[v] == -1 && v != s) {
id[v] = ++cnt;
for(int u = pre[v]; u != v; u = pre[u])
id[u] = cnt;
}
}
if(cnt == 0) break;
for(int i = 1; i <= n; ++i) if(id[i] == -1) id[i] = ++cnt;
for(int i = 1; i <= m; ++i) {
C[i] -= in[B[i]];
A[i] = id[A[i]], B[i] = id[B[i]];
}
n = cnt, s = id[s];
}
return ret;
}
(模板)最小树形图
最新推荐文章于 2021-08-17 19:38:13 发布