日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF-241 E.Flights(差分约束)

發布時間:2024/4/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF-241 E.Flights(差分约束) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CF-241 E.Flights(差分約束)

題目鏈接

題意

n個點m條邊,每條邊可以賦值為1或2,問能否使所有從1到n的路徑值相同

思路

所有路徑和相同,也就是到達每個點的路徑和相同

首先求出所有在1到n路徑上的點

對于一條邊[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; }

總結

以上是生活随笔為你收集整理的CF-241 E.Flights(差分约束)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。