题目传送门

题目大意

给出一个 \(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. vue组件里不用的css还在搜索过滤来删除?试一下vue-clearcss吧!

    这篇文章其实是推广介绍我个人的npm工具库,但你不会后悔点进来的(应该吧...)vue-clearcss 为什么要用它? 一个vue文件在长期迭代中css会越来越冗余,它不像html和js那么好删除, ...

  2. linux上安装Docker (非常简单的安装方法) 2019

    Docker的三大核心概念:镜像.容器.仓库 镜像:类似虚拟机的镜像.用俗话说就是安装文件. 容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例, 可以将其启动.开始.停止.删除.而这些容器都是 ...

  3. NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板

    这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...

  4. GUI容器之Frame

    Frame public class MyFrame { public static void main(String[] args) { //创建一个Frame对象 Frame frame = ne ...

  5. 知乎大佬图文并茂的epoll讲解,看不懂的去砍他

    select.poll.epoll的文章很多,自己也看过不少经典好文.不过第一次看到讲的如此通俗易懂.又图文并茂的.因此拿来分享下,供后续翻看学习. 原文链接:https://zhuanlan.zhi ...

  6. 针对Autocad 2014 第二次安装不上的问题

    针对Autocad 2014 第二次安装不上的问题 1. 以下为卸载过程,不用管. 2. 卸载完之后,右击"开始",点击"运行",得到下图:   并输入:&qu ...

  7. GDB调试:Linux开发人员必备技能

    开篇词:Linux C/C++ 开发人员要熟练掌握 GDB 调试 大家好,我是范蠡,目前在某知名互联网旅游公司基础框架业务部技术专家组任开发经理一职. 本系列课程的主题是 Linux 后台开发的 C/ ...

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

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

  9. 【C++基础教程】第三课

    上次的课后练习答案 练习一 第一题a=8 第二题8 第三题(int)(a+0.2) 提示:把浮点数转换为整数,用强制类型转换的方式.(int)(...)表示把...的内容强制转换为int类型,同理,( ...

  10. PHP中一个好玩的性别判断扩展

    今天我们来学习的一个扩展同时它也是非常小众的一个扩展,其实说白了,或许是根本没什么人用过得扩展.当然,我们也只是出于学习的目的来看看这个扩展到底是什么东西,有什么好玩的地方. 扩展说明 Gender ...