题目传送门

题目大意

给出一个 \(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\),则有:

\[\text{dis}(u)+1\le \text{dis}(v)\le \text{dis}(u)+2
\]

然后我们发现这个东西我们可以用差分约束解决。时间复杂度则为 \(\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的更多相关文章

  1. [CF241E]Flights

    [CF241E]Flights 题目大意: 给一张\(n(n\le1000)\)个点\(m(m\le5000)\)条边的DAG,确定每条边的边权\(w_i(w_i\in\{1,2\})\),使得所有从 ...

  2. CF241E Flights 题解

    题目 做了一下这道题,突然发现自己忘了差分约束,赶紧复习一下. 设当前有n个变量 a1,a2,...,an ,有若干组限制形如 ai≤aj+k (其中k为常数),则由点j向点i连一条边权为k的边,再从 ...

  3. CF241E Flights 差分约束

    传送门 差分约束永远是Itst最烂的图论知识点没有之一qwq 先用dfs把在\(1\)到\(N\)的路径上的所有点都拿出来,其他的点和边状态任意都不会影响答案. 然后考虑设\(dis_i\)表示从\( ...

  4. 【CF241E】Flights(差分约束)

    [CF241E]Flights(差分约束) 题面 CF 有\(n\)个点\(m\)条边,要求给每条边赋一个\(1\)或\(2\)的边权,判断能否使得每一条\(1\)到\(n\)的路径的权值和都相等,如 ...

  5. 【CF241E】Flights

    [CF241E]Flights 题面 洛谷 题解 对于原来的图,如果一条边不出现在\(1\)到\(n\)的路径上面,直接\(ban\)掉即可. 那么考虑一条边\(u\rightarrow v\),一定 ...

  6. CodeForces - 241E Flights 题解

    题目大意: 有一个有向无环图,n个点m条边,所有边权为1或2,求一组使所有从1到n的路径长度相同的边权的方案. 思路: 设从1到i的最短路为dist[i],若有一条从x到y的边,则1<=dist ...

  7. 「CF241E」Flights

    传送门 Luogu 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的. 对于所有在路径上的边 \((u,v)\) 满足 \(1\le dis_v-dis_u\le2\) 差分约束即可. ...

  8. 题解 CF576D 【Flights for Regular Customers】

    对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...

  9. 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 ...

随机推荐

  1. Java如何调用C语言程序,JNI技术

    Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...

  2. cs_play

    # -*-coding:utf-8-*-__author__ = "logan.xu"###构造函数#class Role:# n = 123# # 类变量 比如 n = 123# ...

  3. VMware 部署虚拟环境

    2021-08-23 1. 版本介绍 本地主机操作系统:windows 10虚拟软件版本:VMware workstation 14centos镜像版本:centos 7.5 2. 设置 2.1 基础 ...

  4. JavaScript高级程序设计读书笔记之JSON

    JSON(JavaScript Object Notation)JavaScript对象表示法.JSON是JavaScript的一个严格的子集,利用了JavaScript中的一些模式来表示结构化数据. ...

  5. Golang入门学习(四):常用的函数汇总

    文章目录 2.4 常用的内置函数 2.4.1 字符串常用内置函数 2.4.2 常用的时间和日期相关函数 2.4.3 内置函数 2.4 常用的内置函数 2.4.1 字符串常用内置函数 https://g ...

  6. K8S 简介

    K8S架构与组件 kubectl: 是一个客户端管理工具,直接管理API server,提供请求给API server,中间有auth认证.用户使用kubectl命令来请求API Server接口完成 ...

  7. liquibase新增字段注释导致表格注释同时变更bug记录

    liquibase是一个用于数据库变更跟踪.版本管理和自动部署的开源工具.它的使用方式方法可以参考官方文档或者其他人的博客,这里不做过多介绍. 1. 问题复现 在使用过程中发现了一个版本bug.这个b ...

  8. 云真机兼容性自动化工具测试解决方案_www.alltesting.cn

    问题和背景 不同类型的品牌和硬件环境.不同版本的android操作系统.IO操作系统,以及不同的分辨率,造成相同的APP在不同的设备可能存在缺陷. 兼容性测试,就是让APP.小程序.H5程序,在所有的 ...

  9. docker学习笔记(二)--配置镜像加速器

    前提:docker已经安装好 配置过程 进入至阿里云开发中心,https://dev.aliyun.com/,点击管理中心 管理中心中,点击左侧镜像加速器. 修改配置文件,使用加速器,根据我们目前Do ...

  10. go相关

    mac 上build go  如果想要在centos上面执行 必须使用下面的方式 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello ...