給定一張無向連通圖,存在邊權
c c
與點權a' role="presentation">aa。
加入kk
條特殊邊,構造出這些邊的邊權使得存在一棵最小生成樹使得所有點到
1' role="presentation">1
1號點的距離(只考慮特殊邊的長度)乘以該點點權的乘積最大。n⩽
1000000,m
⩽300000,k
⩽20n
⩽1000000,m
⩽300000,k
⩽20
首先強制選擇
k k
條特殊邊,然後做最小生成樹。
這次選進ms
t' role="presentation">mst
mst的邊一定會選進最後的ms
t mst
。所以先用這些邊進行縮點,這樣就只剩
k k
條特殊邊和至多k2
' role="presentation">k2k
2條特殊邊。 直接o
(k2)
o (k
2)
列舉選擇哪些特殊邊,然後用k2
k
2條非特殊邊使樹聯通並求出每條特殊邊的邊權。
時間複雜度o(
mlog
m+2k
×k2)
o (m
logm
+2k×
k2
)
#include
using
namespace
std;
typedef
long
long lint;
const
int maxn = 100005, maxm = 300005;
const
int inf = 1
<< 30;
int n, m, cnt, tot, tp, root, c[35], fa[2][maxn], f[maxn], d[maxn];
lint siz[maxn], val[maxn];
struct node
}a[maxm], b[35];
inline
int gi()
int getfa(int k, int x)
struct edge e[maxn * 2];
int h[maxn], tot;
inline
void add(int u, int v)
; h[u] = tot;
e[++tot] = (edge) ; h[v] = tot;
}void dfs(int u)
}int main()
; sort(a + 1, a + m + 1);
for (int i = 1; i <= n; ++i) fa[0][i] = fa[1][i] = i;
for (int u, v, i = 1; i <= cnt; ++i)
for (int u, v, i = 1; i <= m; ++i)
}root = getfa(1, 1);
for (int i = 1; i <= n; ++i) val[getfa(1, i)] += gi();
for (int i = 1; i <= n; ++i) if (getfa(1, i) == i) c[++c[0]] = i;
for (int i = 1; i <= cnt; ++i)
b[i].u = getfa(1, b[i].u), b[i].v = getfa(1, b[i].v);
for (int i = 1; i <= m; ++i)
a[i].u = getfa(1, a[i].u), a[i].v = getfa(1, a[i].v);
for (int u, v, i = 1; i <= m; ++i)
lint ans = 0;
for (int k = 0; k < (1
<< cnt); ++k)
bool flag = true;
for (int u, v, i = 1; i <= cnt; ++i)
if (k & (1
<< (i - 1))) fa[0][u] = v;
add(b[i].u, b[i].v);
}if (!flag) continue;
for (int u, v, i = 1; i <= cnt; ++i)
}dfs(root);
for (int u, v, i = 1; i <= cnt; ++i)
}lint tmp = 0;
for (int u, v, i = 1; i <= cnt; ++i)
if (k & (1
<< (i - 1)))
ans = max(ans, tmp);
}printf("%lld\n", ans);
return
0;}
APIO2013 道路費用
題目鏈結 大意是說,調整k條特殊邊邊的值,並在原圖的基礎上構建最小生成樹。使得經過所有特殊邊的值之和最大。感謝das 學長指出題目要素 加上新邊,兩點之間最多只有一條邊 請各位在理解下文解法時特別注意,如果沒有這一要求是不能設計如下演算法的。在此安利一下hgeek首席程式設計師的部落格。大致解法 先...
bzoj3206 Apio2013 道路費用
第一行包含三個由空格隔開的整數n,m和k。接下來的 m行描述最開始的m 條道路 這m行中的第i行包含由空格隔開的整數ai,bi和c i,表示有一條在a i和b i之間,費用為c i的雙向道路。接下 來的k行描述新建的k條道路。這 k行中的第i行包含由空格隔開的整數 xi和yi,表示有一條連線城鎮xi...
C 心路歷程30 APIO2013 道路費用
問題描述 皮特現在是c國最富有的人。c國共有n個城市 用1 n 編號 現在這些城市由m條雙向道路連線,其中城市1為首都。保證乙個人從城市1出發,經過這些道路可以到達其他的任何乙個城市。當然,所有的這些道路都是要收費的,使用道路i需要向該道路的所有者支付ci的費用。已知所有的ci互不相同。最近c國計畫...