CF-346 D. Robot Control(反向建图spfa)
生活随笔
收集整理的這篇文章主要介紹了
CF-346 D. Robot Control(反向建图spfa)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF-346 D. Robot Control(反向建圖spfa)
題目鏈接
題意
有向圖(有環)中有一個機器人,機器人有三種規則:
為了讓機器人安全的從SSS到TTT,可以在多岔路口制定它的方向來避免情況1,2的發生,求最少需要指定方向幾次
思路
有一個轉移方程:
對于點uuu和它所有的出邊vvv,dp[u]dp[u]dp[u]表示從uuu點到TTT最少需要指定方向的次數
dp[u]=min(min(dp[v])+1,max(dp[v]))dp[u] = min(min(dp[v]) + 1, max(dp[v]))dp[u]=min(min(dp[v])+1,max(dp[v]))
這題用cincincin很慢不知道為啥…(CF不是不卡讀入嗎?)
#include <bits/stdc++.h> const int maxn = 1e6 + 5; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; using namespace std; int in[maxn], dp[maxn], vis[maxn]; vector<int> g[maxn]; void bfs(int s, int e) {fill(dp, dp+maxn, -1);fill(vis, vis+maxn, 0);deque<int> que;que.push_back(e);dp[e] = 0;while (!que.empty()) {int u = que.front();que.pop_front();if (vis[u]) continue;vis[u] = 1;if (u == s) return;for (auto v : g[u]) {in[v]--;if (in[v] == 0 && (dp[v] == -1 || dp[v] > dp[u])) {// 最后訪問v點dp[v] = dp[u];que.push_front(v); // 優先更新下一個點}else if(dp[v] == -1) {// 第一次訪問v點dp[v] = dp[u] + 1;que.push_back(v); // 最后更新下個點}}} } int main() {int n, m;scanf("%d %d", &n, &m);fill(in, in+maxn, 0);for (int i = 0; i < m; ++i) {int u, v;scanf("%d %d", &u, &v);g[v].push_back(u);in[u]++;}int s, e;scanf("%d %d", &s, &e);bfs(s, e);printf("%d\n", dp[s]);return 0; }總結
以上是生活随笔為你收集整理的CF-346 D. Robot Control(反向建图spfa)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF-1249 F.Maximum We
- 下一篇: CF-1207 F. Remainder