[CF241E]Flights

题目大意:

给一张\(n(n\le1000)\)个点\(m(m\le5000)\)条边的DAG,确定每条边的边权\(w_i(w_i\in\{1,2\})\),使得所有从\(1\)到\(n\)的路径拥有相同的长度。

思路:

首先用BFS求出所有与\(1\)到\(n\)路径有关的点构成的子图。

这样,\(1\)到子图上每个点的长度都是确定的,即终点相同的路径拥有相同的长度。有\(d_i\)表示点\(1\)到点\(i\)的距离,则对于边\(u\to v\),有\(1\le d_v-d_u\le2\)。这样我们就可以得到一个差分约束系统,使用SPFA求最长路即可。

源代码:

#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1001,M=5000;
struct Edge {
int u,v;
};
Edge edge[M];
std::vector<int> e[N];
std::vector<Edge> h[N];
int n,m,vis[N],dis[N];
bool f[N],g[N],inq[N];
std::queue<int> q;
inline void bfs1() {
for(register int i=0;i<m;i++) {
e[edge[i].u].push_back(edge[i].v);
}
q.push(1);
f[1]=true;
while(!q.empty()) {
const int &x=q.front();
for(auto &y:e[x]) {
if(!f[y]) {
q.push(y);
f[y]=true;
}
}
q.pop();
}
for(register int i=1;i<=n;i++) {
e[i].clear();
}
}
inline void bfs2() {
for(register int i=0;i<m;i++) {
e[edge[i].v].push_back(edge[i].u);
}
q.push(n);
g[n]=true;
while(!q.empty()) {
const int &x=q.front();
for(auto &y:e[x]) {
if(!g[y]) {
q.push(y);
g[y]=true;
}
}
q.pop();
}
for(register int i=1;i<=n;i++) {
e[i].clear();
}
}
inline void spfa() {
q.push(1);
while(!q.empty()) {
const int &x=q.front();
for(auto &j:h[x]) {
const int &y=j.u,&w=j.v;
if(dis[x]+w>dis[y]) {
dis[y]=dis[x]+w;
if(!inq[y]) {
inq[y]=true;
q.push(y);
if(++vis[y]>n) {
throw 0;
}
}
}
}
q.pop();
inq[x]=false;
}
}
int main() {
n=getint(),m=getint();
for(register int i=0;i<m;i++) {
const int u=getint(),v=getint();
edge[i]=(Edge){u,v};
}
bfs1();
bfs2();
for(register int i=0;i<m;i++) {
const int &u=edge[i].u,&v=edge[i].v;
if(f[u]&&g[u]&&f[v]&&g[v]) {
h[u].push_back((Edge){v,1});
h[v].push_back((Edge){u,-2});
}
}
try {
spfa();
} catch(...) {
puts("No");
return 0;
}
puts("Yes");
for(register int i=0;i<m;i++) {
const int &u=edge[i].u,&v=edge[i].v;
if(f[u]&&g[u]&&f[v]&&g[v]) {
printf("%d\n",dis[v]-dis[u]);
} else {
puts("1");
}
}
return 0;
}

[CF241E]Flights的更多相关文章

  1. CF241E Flights 题解

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

  2. CF241E Flights 差分约束

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

  3. 题解 CF241E Flights

    题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度 ...

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

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

  5. 【CF241E】Flights

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

  6. 「CF241E」Flights

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

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

  8. (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

    In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...

  9. [Swift]LeetCode787. K 站中转内最便宜的航班 | Cheapest Flights Within K Stops

    There are n cities connected by m flights. Each fight starts from city u and arrives at v with a pri ...

随机推荐

  1. UML和模式应用5:细化阶段(4)--如何创建领域模型

    1.前言 以当前迭代中所要设计的需求为界,创建领域模型的步骤: 1.寻找概念类 2.将其绘制为UML类图中的类 3.添加关联和属性 2.如何寻找概念类 寻找概念类有如下几种方法: 重用和修改现有的模型 ...

  2. Linux中THIS_MODULE宏定义详解

    一直都在耿耿于怀,这个THIS_MODULE到底是个什么玩意,linux内核中无处不在的东西.今天上网搜了一下,算是基本明白了.网上牛人写的已经比较详细,另外目前暂时没有时间往更深层次分析,所以直接贴 ...

  3. java.lang.NoClassDefFoundError: com/google/inject/Injector

    报错如下: 解决方案: <dependency> <groupId>com.google.inject</groupId> <artifactId>gu ...

  4. PYTHON-函数的定义与调用,返回值,和参数

    函数基础'''1. 什么是函数 具备某一功能的工具->函数 事先准备工具的过程--->函数的定义 遇到应用场景,拿来就用---->函数的调用 函数分类两大类: 1. 内置函数 2. ...

  5. webpack文件笔记

    webpack.prod.conf.js里面的ExtractTextPlugin,把css文件提取出来,专门进行打包minify :压缩 依赖的第三方库打包到vendor.js里面 每次项目打包的时候 ...

  6. jvm字节占用空间分析

    一个对象实例占用了多少字节,消耗了多少内存?这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看 ...

  7. python 全栈开发,Day118(django事务,闭包,客户管理,教学管理,权限应用)

    昨日内容回顾 一.django事务 什么是事务 一系列将要发生或正在发生的连续操作. 作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操 ...

  8. .Net开发工程师工具箱

    Visual Studio Visual Studio Productivity Power tool:Visual Studio专业版(及以上)的扩展,具有丰富的功能,如快速查找,导航解决方案,可搜 ...

  9. DB操作-用批处理执行Sql语句

    用批处理在命令行状态下调用查询分析器来执行这个sql文件里的语句.下面就是sqlserver帮助里对于查询分析器(isqlw)命令行参数的解释:isqlw 实用工具(SQL 查询分析器)使您得以输入 ...

  10. 跨域资源共享CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而 ...