大陸爭霸 SDOI2010 帶限制最短路

2022-05-27 13:39:16 字數 2186 閱讀 1946

只要你有無限個自爆機械人,你就能為所欲為 斯普林·布拉澤

【題目描述】

略一句話題意:

傑森國有 \(n\) 個城市,由 \(m\) 條單向道 路連線。傑森國的首都是城市 \(n\)。你只需摧毀傑森國首都就能獲勝。為了盡量減小己方的消耗,你決定使用自爆機械人完成這一任務。唯一的困難是,傑森國的一部分城市有結界保護,不破壞掉結界就無法進入城市。而每個城市的結界都是由分布在其他城市中的一些結界發生器維持的,如果想進入某個城市,你就必須破壞掉維持這個城市結界的所有結界發生器。 現在你有無限多的自爆機械人,一旦進入了某個城市,自爆機械人可以瞬間引爆,破壞乙個目標(結界發生器,或是傑森國首都),當然機械人本身也會一起被破壞。你需要知道:擊敗傑森國所需的最短時間。

【輸入格式】

第一行兩個正整數 n, m。 接下來 m行,每行三個正整數 \(u_i, v_i ,w_i\),表示有一條從城市\(u_i\)到城市\(v_i\)的單向道路,自爆機械人通過這條道路需要\(w_i\)的時間。之後 \(n\) 行,每行描述乙個城市。首先是乙個正整數 \(l_i\),代表維持這個城市結界所使用的結界發生器數目。之後\(l_i\)個\(1\)~\(n\) 之間的城市編號,表示每個結界發生器的 位置。如果\(l_i = 0\),則說明該城市沒有結界保護,保證\(l_1 = 0\)。

【輸出格式】

僅包含乙個正整數 ,擊敗傑森國所需的最短時間。

【思路點撥】

如果沒有結界的限制,很明顯此題就只需要跑一遍\(dijkstra\)就過了。

第一眼看到這題就想到拓撲排序。

當時在考場上先寫了乙個最短路算每個點到源點的最短距離,然後根據結界發生器的拓撲序更新\(ans[i] = max(dist[i], ans[j])\),其中城市\(j\)的結界發生器維持城市\(i\)結界。

大樣例一次過,美滋滋

考試結束,

不過,其實這題也就只需要在最短路演算法上小小的改動一下就行了。

開三個陣列\(dist, tme, ans\),\(dist[i]\)表示源點到點\(i\)的最短距離,\(tme[i]\)表示點\(i\)最早在此時解除結界,\(ans[i]\)則表示城市\(i\)最早能在\(ans[i]\)時被炸飛。

顯然,\(ans[i] = max(dist[i], tme[i])\)。

而對於\(tme[i]\),\(\forall j \in l[i], tme[i] = max(ans[j])\),其中\(l[i]\)代表維持城市\(i\)結界的城市的集合。

然後直接跑一遍\(dijkstra\), 不過要在更新完\(l[i]\)中所有的城市後才能將\(i\)入堆。

最後的答案就是\(ans[n]\),時間複雜度\(o(m log n)\)。

【**實現】

#include #include #include #include #define re register

using namespace std;

typedef long long ll;

ll n, m;

ll head[100005], pre[150005], to[150005], val[150005], len;

ll h2[100005], p2[100005], t2[100005], l2, in[100005], ans[100005], dis[100005], tme[100005];

bool vis[100005];

ll read()

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

return ret * flag;

}void insert(ll u, ll v, ll w)

void insert2(ll u, ll v)

void dijkstra()

}} for (re ll i = h2[c]; i != 0; i = p2[i])

}} }

}int main()

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

} dijkstra();

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

return 0;

}

SDOI2010 大陸爭霸 帶限制最短路

首先明確最短路是dp 帶繼承的dp 是有轉移的 bellman沒有順序的鬆弛 複雜度很高 dijk維護乙個正解點集 很快 這道題給最短路加了限制 同時走若干條路,當走過某些點後才能走該點 原轉移為 d x min 新加的轉移為 d x max 可以知道 依然可以維護乙個正解點集 當沒有protect...

SDOI2010 最短路 大陸爭霸

我們將每個節點的最短距離記錄為如下兩個量 arr 和 into 分別代表達到當前點的最短距離和滿足當前節點前置條件的最短距離,最短距離在兩者中取大值。然後硬跑最短路就行了。include include include include define maxn 300005 define maxm 7...

1922 Sdoi2010 大陸爭霸

time limit 10 sec memory limit 64 mb submit 1552 solved 682 submit status discuss 在乙個遙遠的世界裡有兩個國家 位於大陸西端的傑森國和位於大陸東端的 克里斯國。兩個國家的人民分別信仰兩個對立的神 傑森國信仰象徵黑暗和毀...