APIO2013 道路費用

2021-08-27 16:11:14 字數 2077 閱讀 1270

題目鏈結

大意是說,調整k條特殊邊邊的值,並在原圖的基礎上構建最小生成樹。使得經過所有特殊邊的值之和最大。

感謝das***學長指出題目要素(加上新邊,兩點之間最多只有一條邊),請各位在理解下文解法時特別注意,如果沒有這一要求是不能設計如下演算法的。在此安利一下hgeek首席程式設計師的部落格。

大致解法:

先縮點。可以知道,對答案有貢獻的只有k條新邊。先將k條邊進行最小生成樹,再構建一棵完成的最小生成樹。

除去那些新邊會產生k+1個連通塊,而這連通塊中的邊的連線方法對答案是沒有貢獻的,起到主要貢獻的是連線這些連通塊的新邊。當然也會有k條原邊可以替代它們。

先進行暴力列舉k條邊的選或者不選,總共2k

2

k種狀態。用選定的新邊將連通塊相連,不足的部分用原邊代替。那麼在這棵樹中主要是求到每個點的人數和所有新邊的最大值。每點人數用樹上字首和即可;求新邊最值需要借用kruskal的思想,即在樹上從u到v的路徑中的所有邊權必須小於等於新加進的邊,不然就可以用新邊代替之,如此約束每條新邊的值即可。

code:

#include

typedef

long

long ll;

const

int inf=1

<<30;

using

namespace

std;

ll ans;

int n,m,k,top,cnt,st;

int fa[100005],fa2[100005],p[100005];

struct edgegee[300005],ne[25],q[300005];

struct dataedge[50];

int ag[25],dep[100005],head[100005],mn[100005];

ll val[100005],sum[100005];

bool mark[300005];

void insert(int u,int v)

;head[u]=cnt;

edge[++cnt]=(data);head[v]=cnt;

}int find(int x)

int find2(int x)

bool

operator

<(edgege a,edgege b)

}void solve()

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

if(mark[i])

//將新邊加入mst

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

//構建完整的mst

dp(st);//樹上字首和(人數)

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

}//退化版lca

ll res=0;

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

if(mark[i])

ans=max(res,ans);

}void dfs(int x)

mark[x]=0;dfs(x+1);

mark[x]=1;dfs(x+1);

}int main()

}//這裡find合併成了一棵樹

//find2是k+1塊

st=find2(1);//初始1所在集合

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

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

ne[i].u=find2(ne[i].u),ne[i].v=find2(ne[i].v);

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

e[i].u=find2(e[i].u),e[i].v=find2(e[i].v);

//重構邊,負責連塊

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

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

if(mark[i])q[++top]=e[i];//取那些有用的邊

memset(mark,0,sizeof(mark));

dfs(1);

printf("%lld\n",ans);

return

0;}

APIO2013 道路費用

給定一張無向連通圖,存在邊權 c c 與點權a role presentation aa。加入kk 條特殊邊,構造出這些邊的邊權使得存在一棵最小生成樹使得所有點到 1 role presentation 1 1號點的距離 只考慮特殊邊的長度 乘以該點點權的乘積最大。n 1000000,m 30000...

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