FJOI2014 最短路徑樹問題

2022-08-20 23:12:19 字數 1830 閱讀 7628

here

吐槽一下這個題,完全就是兩個裸題拼一起了,而且兩個板子之間毫無聯絡…

首先我們造乙個保證字典序最小的最短路徑樹,怎麼保證字典序呢,先將你存的圖按字典序從小到大重新排個序再跑最短路就行了。之後就是:跑 \(dijkstra\),\(dfs\) 一遍重新建圖,如果 \(u\) 已經被訪問過,那麼邊 \(e\\) 在最短路上的當且僅當:\(dist[u] + d == dist[v]\) 。

建完了最短路樹之後,問題就是 詢問一顆樹上的經過點數等於 \(k\) 的路徑長度的最大值,以及最長路徑的條數(路徑必須滿足經過的點數等於 \(k\))這個就是點分治裸題了。

#includeusing namespace std;

int read()

while(ch>='0'&&ch<='9')

return x * f;

}const int n = 30030;

const int m = 60060;

vector> g[n];

struct nodee[m << 1];

int h[n], num2;

void rb(int from, int to, int dis)

priority_queue, vector>, greater> >q;

int dist[n], vis[n];

void dijkstra()}}

}void rebuild(int u)

}int root, sum, sz[n], f[n], s[n], num[n], ans, ans2, maxd, n, m, k;

void getroot(int u, int fa)

f[u] = max(f[u], sum - sz[u]);

if(f[root] > f[u]) root = u;

}void dfs(int u, int fa, int now)

return;

}int nowans = -1;

if(s[k - 1 - now] != -1) nowans = dist[u] + s[k - 1 - now];

if(ans == nowans) ans2 += num[k - 1 - now];

if(nowans > ans)

for(int i=h[u]; i; i=e[i].nxt)

}void update(int u, int fa, int now)

}void solve(int u)

for(int i=1; i<=maxd; i++) s[i] = -1, num[i] = 0;

for(int i=h[u]; i; i=e[i].nxt)

}int main()

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

dijkstra();

memset(vis, 0, sizeof(vis));

rebuild(1);

sum = n; root = 0;

memset(vis, 0, sizeof(vis));

memset(dist, 0, sizeof(dist));

memset(s, -1, sizeof(s));

getroot(1, 0);

solve(root);

cout << ans << " " << ans2;

return 0;

}

雖說是點分治裸題不過我還是在寫的時候犯了乙個小錯誤,就是我之前沒有記錄 \(num\)陣列,然後樣例一直輸出 \(3\ 2\),玩了樣例之後才發現自己 \(sb\) 了,所以說以後問題要分析仔細一點…

FJOI2014最短路徑樹問題

給乙個包含n個點,m條邊的無向連通圖。從頂點1出發,往其餘所有點分別走一次並返回。往某乙個點走時,選擇總長度最短的路徑走。若有多條長度最短的路徑,則選擇經過的頂點序列字典序最小的那條路徑 如路徑a為1,32,11,路徑b為1,3,2,11,路徑b字典序較小。注意是序列的字典序的最小,而非路徑中節點編...

FJOI2014 最短路徑樹問題

這題已經在我的收藏夾裡吃了大半年的灰了 主要是因為他們有人把這題歸到了樹形dp裡面,然後我就傻乎乎地把它收藏了 首先,假設我們已經求出了這個 最短路徑樹 剩下的就是點分治的板子了。而這個 最短路徑樹 首先可以通過dijkstra跑出最短路徑dag,然後在dag上用bfs即可求出字典序最小的樹。總的來...

樹的分治 FJOI2014最短路徑樹問題

題目大意 給乙個包含n個點,m條邊的無向連通圖。從頂點1出發,往其餘所有點分別走一次並返回。往某乙個點走時,選擇總長度最短的路徑走。若有多條長度最短的路徑,則選擇經過的頂點序列字典序最小的那條路徑 如路徑a為1,32,11,路徑b為1,3,2,11,路徑b字典序較小。注意是序列的字典序的最小,而非路...