[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. Centos6.5使用yum安装svn

    1.测试环境 centos5.5 2.安装svn yum -y install subversion //测试SVN是否安装成功,执行:svnserve --version 3.配置 mkdir /w ...

  2. Word 2017 快捷键

    Ctrl + D: 呼出[字体] Ctrl + S: 进行[保存] Ctrl + F: 呼出[导航] Ctrl + D: 呼出[字体] Ctrl + B: 进行[加粗] Ctrl + G: 呼出[查找 ...

  3. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  4. python内存数据库pydblite

    Pure-Python engine 最近由于项目开发中发现python informixDB模块对多线程的支持非常不好,当开启两个线程同时连接informix数据库的时候,数据库会报错,显示SQL ...

  5. Http请求中请求头Content-Type讲解

    在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 Med ...

  6. Java基础96 ajax技术的使用

    本文知识点(目录): 1.ajax的概念   2.使用ajax技术获取服务端的数据_实例   3.使用ajax技术检查用户名是否已存在_实例   4.使用ajax技术验证登录页面的用户名和密码_实例 ...

  7. how to detect circles and rectangle?

    opencv中对圆检测的函数为:HoughCircles(src_gray,circles,CV_HOUGHT_GRADIENT,1,src_gray.cols/8,200,100,0,0) circ ...

  8. 前景检测(1):VIBE

    参考:http://blog.csdn.net/zouxy09/article/details/9622285 看论文很多细节不明白,看这位博主实现的代码就能明白了.

  9. LeetCode(58): 最后一个单词的长度

    Easy! 题目描述: 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. ...

  10. Java集合(Collection)综述

    1.集合简介 数学定义:一般地,我们把研究对象统称为元素.把一些元素组成的总体叫做集合. java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器. java中通用集合类存放于jav ...