APIO2013 道路費用

2021-08-19 06:09:55 字數 2524 閱讀 1083

給定一張無向連通圖,存在邊權

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國計畫...