【CF241E】Flights

题面

洛谷

题解

对于原来的图,如果一条边不出现在\(1\)到\(n\)的路径上面,直接\(ban\)掉即可。

那么考虑一条边\(u\rightarrow v\),一定满足\(1\leq dis_v-dis_u\leq 2\),其中\(dis_u,dis_v\)表示\(1\)到\(u,v\)的最短路。直接根据这个性质跑差分约束即可,一条边的答案即为\(dis_v-dis_u\)。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int INF = 1e9;
const int MAX_N = 1e3 + 5, MAX_M = 5e3 + 5;
struct Edge { int u, v; } a[MAX_M];
struct Graph { int to, cost; } ;
vector<Graph> G[MAX_N];
vector<int> E[MAX_N];
int N, M, vis[MAX_N];
void bfs(int s, int op) {
queue<int> que;
que.push(s), ++vis[s];
while (!que.empty()) {
int x = que.front(); que.pop();
for (auto v : E[x])
if (vis[v] == op) ++vis[v], que.push(v);
}
}
int dis[MAX_N];
bool inq[MAX_N];
bool spfa() {
static int cnt[MAX_N];
queue<int> que; que.push(1), inq[1] = 1, ++cnt[1];
for (int i = 2; i <= N; i++) dis[i] = INF;
while (!que.empty()) {
int x = que.front(); que.pop();
for (auto e : G[x]) {
int v = e.to, w = e.cost;
if (dis[x] + w < dis[v]) {
dis[v] = dis[x] + w;
if (!inq[v]) ++cnt[v], inq[v] = 1, que.push(v);
if (cnt[v] >= N) return 0;
}
}
inq[x] = 0;
}
return 1;
}
int main () {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
N = gi(), M = gi();
for (int i = 1; i <= M; i++) {
a[i].u = gi(), a[i].v = gi();
E[a[i].u].push_back(a[i].v);
}
bfs(1, 0);
for (int i = 1; i <= N; i++) E[i].clear();
for (int i = 1; i <= M; i++) E[a[i].v].push_back(a[i].u);
bfs(N, 1);
for (int i = 1; i <= M; i++) {
int u = a[i].u, v = a[i].v;
if (vis[u] != 2 || vis[v] != 2) continue;
G[u].push_back((Graph){v, 2});
G[v].push_back((Graph){u, -1});
}
if (spfa()) puts("Yes");
else return puts("No") & 0;
for (int i = 1; i <= M; i++) {
int u = a[i].u, v = a[i].v;
if (vis[u] != 2 || vis[v] != 2) puts("1");
else printf("%d\n", dis[v] - dis[u]);
}
return 0;
}

最新文章

  1. web前端之性能优化
  2. Android 常见Crash Log汇总
  3. PHP 判断是否为Get/Post/Ajax提交
  4. c#中的interface abstract与virtual
  5. 【转】Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析
  6. WebAPI客户端
  7. elasticsearch的rest搜索---对于相关度的大牛的文档
  8. Implement a Linked List
  9. golang map
  10. 【BZOJ 2844】: albus就是要第一个出场
  11. P3372 【模板】线段树 1
  12. python与mysql交互中的各种坑
  13. Redis为什么可以支持那么大的并发访问量?为什么redis没有单点并发瓶颈?
  14. ARCore中Pose类变换点的算法实现
  15. unity插件,从一段文字中提取中文并去重
  16. Android驱动中的remap_pfn_range()校验漏洞(CVE-2013-2596)
  17. SourceTree跳过Atlassian账号,免登陆,跳过初始设置
  18. AloneQIan---第一次作业
  19. MyEclipse和Microsoft Visual Studio常用快捷键
  20. ny236 心急的C小加 hdoj1051 Wooden Sticks

热门文章

  1. 创建一个dotnetcore的SPA模板项目
  2. Kubernetes(k8s)网络插件(CNI)的基准测试对比
  3. gcc 编译过程
  4. 【Mysql技术内幕InnoDB存储引擎】读书笔记
  5. javascript实现网页倒计时效果
  6. Nexus6p手机root和安装xposed
  7. tp5 宝塔open_basedir restriction in effect 错误; IIS open_basedir restriction in effect
  8. Java开发环境之Svn
  9. Sublime Text3 安装 CTags 插件出现乱码
  10. 自定义View(三),仿支付宝芝麻信用自定义控件