CF-241 E.Flights(差分约束)
生活随笔
收集整理的這篇文章主要介紹了
CF-241 E.Flights(差分约束)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
CF-241 E.Flights(差分約束)
題目鏈接
題意
n個(gè)點(diǎn)m條邊,每條邊可以賦值為1或2,問能否使所有從1到n的路徑值相同
思路
所有路徑和相同,也就是到達(dá)每個(gè)點(diǎn)的路徑和相同
首先求出所有在1到n路徑上的點(diǎn)
對(duì)于一條邊[u,v][u,v][u,v],$ 1\le dis[v] - dis[u] \le 2 $
addedge(u, v, 2)
addedge(v, u, -1)
然后差分約束
#include <bits/stdc++.h> const int maxn = 5e3 + 5; const int inf = 0x3f3f3f3f; using namespace std; int ans[maxn], cnt[maxn], dis[maxn], vis[maxn]; int n, m; vector<int> g1[maxn], g2[maxn]; vector<pair<int,int> > g[maxn]; vector<pair<int,int> > edge; void dfs1(int u) {cnt[u]++;for (auto v : g1[u]) {if (cnt[v]) continue;dfs1(v);} } void dfs2(int u) {cnt[u] += 2;for (auto v : g2[u]) {if (cnt[v] & 2) continue;dfs2(v);} }void spfa() {fill(dis, dis+maxn, inf);fill(vis, vis+maxn, 0);fill(cnt, cnt+maxn, 0);queue<int> que;que.push(1);dis[1] = 0;vis[1] = 1;cnt[1] = 1;while (!que.empty()) {int u = que.front();que.pop();vis[u] = 0;for (auto it : g[u]) {int v, c;tie(v, c) = it;if (dis[v] > dis[u] + c) {dis[v] = dis[u] + c;if (vis[v]) continue;vis[v] = 1;que.push(v);if (++cnt[v] > n) {cout << "No\n";exit(0);}}}} } int main() {cin >> n >> m;for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;edge.push_back(make_pair(u, v));g1[u].push_back(v);g2[v].push_back(u);}fill(cnt, cnt+maxn, 0);dfs1(1);dfs2(n);for (int i = 0; i < m; ++i) {int u, v;tie(u, v) = edge[i];if (cnt[u] != 3 || cnt[v] != 3) continue;g[u].push_back(make_pair(v, 2));g[v].push_back(make_pair(u, -1));}spfa();cout << "Yes\n";for (int i = 0; i < m; ++i) {int u, v;tie(u, v) = edge[i];ans[i] = dis[v] - dis[u];if (ans[i] != 1 && ans[i] != 2) ans[i] = 1;cout << ans[i] << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的CF-241 E.Flights(差分约束)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF-196 D.The Next Go
- 下一篇: CF-557 E. Ann and Ha