题解 CF241E Flights
题目大意
给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度都相同。
\(n\le 10^3,m\le 5\times 10^3\)
思路
老实说,真的对得起 \(2600\) 的评分(以我现在的角度来看),正解应该算比较难想的吧。。。
首先肯定需要把没有用的路径删掉,就是不能从 \(1\to n\) 的路径。
首先我们会发现一个比较显然的结论:\(1\to i\) 的任意路径都应该相同。这个结论应该都能想到,但是应该怎么用呢?如果我们设 \(\text{dis}(i)\) 表示 \(1\to i\) 的最短路径长度,那么如果存在边 \(u\to v\),则有:
\]
然后我们发现这个东西我们可以用差分约束解决。时间复杂度则为 \(\texttt{SPFA}\) 的时间复杂度。
\(\texttt{Code}\)
#include <bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define Int register int
#define MAXM 5005
#define MAXN 1005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int n,m;
PII Edge[MAXM];
int toop = 1,to[MAXM << 1],nxt[MAXM << 1],wei[MAXM << 1],tim[MAXN],vis[MAXN],dis[MAXN],head[MAXN];
void Add_Edge (int u,int v,int w){
// cout << u << " -> " << v << ": " << w << endl;
to[++ toop] = v,wei[toop] = w,nxt[toop] = head[u],head[u] = toop;
}
void Spfa (){
queue <int> q;
while (!q.empty()) q.pop ();
memset (vis,0,sizeof (vis));
memset (dis,0x3f,sizeof (dis));
q.push (1),vis[1] = 1,dis[1] = 0;
while (!q.empty()){
int u = q.front();q.pop ();vis[u] = 0,tim[u] ++;
if (tim[u] > n){
puts ("No");
exit (0);
}
for (Int i = head[u];i;i = nxt[i]){
int v = to[i],w = wei[i];
if (dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
if (!vis[v]) vis[v] = 1,q.push (v);
}
}
}
}
vector <int> G[2][MAXN];
int ans[MAXN],vis1[MAXN];
void dfs (int u,int ty){vis1[u] |= 1 << ty;for (int v : G[ty][u]) if (!(vis1[v] & (1 << ty)))dfs (v,ty);}
signed main(){
read (n,m);
for (Int i = 1,u,v;i <= m;++ i) read (u,v),Edge[i] = make_pair (u,v),G[0][u].push_back (v),G[1][v].push_back (u);
dfs (1,0),dfs (n,1);for (Int i = 1,u,v;i <= m;++ i){
u = Edge[i].first,v = Edge[i].second;
if (vis1[u] == 3 && vis1[v] == 3) Add_Edge (u,v,2),Add_Edge (v,u,-1);
}
Spfa ();
puts ("Yes");
for (Int i = 1;i <= m;++ i){
int u = Edge[i].first,v = Edge[i].second;
if (vis1[u] == 3 && vis1[v] == 3) write (dis[v] - dis[u]),putchar ('\n');
else puts ("1");
}
return 0;
}
题解 CF241E Flights的更多相关文章
- [CF241E]Flights
[CF241E]Flights 题目大意: 给一张\(n(n\le1000)\)个点\(m(m\le5000)\)条边的DAG,确定每条边的边权\(w_i(w_i\in\{1,2\})\),使得所有从 ...
- CF241E Flights 题解
题目 做了一下这道题,突然发现自己忘了差分约束,赶紧复习一下. 设当前有n个变量 a1,a2,...,an ,有若干组限制形如 ai≤aj+k (其中k为常数),则由点j向点i连一条边权为k的边,再从 ...
- CF241E Flights 差分约束
传送门 差分约束永远是Itst最烂的图论知识点没有之一qwq 先用dfs把在\(1\)到\(N\)的路径上的所有点都拿出来,其他的点和边状态任意都不会影响答案. 然后考虑设\(dis_i\)表示从\( ...
- 【CF241E】Flights(差分约束)
[CF241E]Flights(差分约束) 题面 CF 有\(n\)个点\(m\)条边,要求给每条边赋一个\(1\)或\(2\)的边权,判断能否使得每一条\(1\)到\(n\)的路径的权值和都相等,如 ...
- 【CF241E】Flights
[CF241E]Flights 题面 洛谷 题解 对于原来的图,如果一条边不出现在\(1\)到\(n\)的路径上面,直接\(ban\)掉即可. 那么考虑一条边\(u\rightarrow v\),一定 ...
- CodeForces - 241E Flights 题解
题目大意: 有一个有向无环图,n个点m条边,所有边权为1或2,求一组使所有从1到n的路径长度相同的边权的方案. 思路: 设从1到i的最短路为dist[i],若有一条从x到y的边,则1<=dist ...
- 「CF241E」Flights
传送门 Luogu 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的. 对于所有在路径上的边 \((u,v)\) 满足 \(1\le dis_v-dis_u\le2\) 差分约束即可. ...
- 题解 CF576D 【Flights for Regular Customers】
对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...
- Codeforces Round #384 (Div. 2) A. Vladik and flights 水题
A. Vladik and flights 题目链接 http://codeforces.com/contest/743/problem/A 题面 Vladik is a competitive pr ...
随机推荐
- Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
- cs_play
# -*-coding:utf-8-*-__author__ = "logan.xu"###构造函数#class Role:# n = 123# # 类变量 比如 n = 123# ...
- VMware 部署虚拟环境
2021-08-23 1. 版本介绍 本地主机操作系统:windows 10虚拟软件版本:VMware workstation 14centos镜像版本:centos 7.5 2. 设置 2.1 基础 ...
- JavaScript高级程序设计读书笔记之JSON
JSON(JavaScript Object Notation)JavaScript对象表示法.JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据. ...
- Golang入门学习(四):常用的函数汇总
文章目录 2.4 常用的内置函数 2.4.1 字符串常用内置函数 2.4.2 常用的时间和日期相关函数 2.4.3 内置函数 2.4 常用的内置函数 2.4.1 字符串常用内置函数 https://g ...
- K8S 简介
K8S架构与组件 kubectl: 是一个客户端管理工具,直接管理API server,提供请求给API server,中间有auth认证.用户使用kubectl命令来请求API Server接口完成 ...
- liquibase新增字段注释导致表格注释同时变更bug记录
liquibase是一个用于数据库变更跟踪.版本管理和自动部署的开源工具.它的使用方式方法可以参考官方文档或者其他人的博客,这里不做过多介绍. 1. 问题复现 在使用过程中发现了一个版本bug.这个b ...
- 云真机兼容性自动化工具测试解决方案_www.alltesting.cn
问题和背景 不同类型的品牌和硬件环境.不同版本的android操作系统.IO操作系统,以及不同的分辨率,造成相同的APP在不同的设备可能存在缺陷. 兼容性测试,就是让APP.小程序.H5程序,在所有的 ...
- docker学习笔记(二)--配置镜像加速器
前提:docker已经安装好 配置过程 进入至阿里云开发中心,https://dev.aliyun.com/,点击管理中心 管理中心中,点击左侧镜像加速器. 修改配置文件,使用加速器,根据我们目前Do ...
- go相关
mac 上build go 如果想要在centos上面执行 必须使用下面的方式 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello ...