[CF241E]Flights
[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的更多相关文章
- CF241E Flights 题解
题目 做了一下这道题,突然发现自己忘了差分约束,赶紧复习一下. 设当前有n个变量 a1,a2,...,an ,有若干组限制形如 ai≤aj+k (其中k为常数),则由点j向点i连一条边权为k的边,再从 ...
- CF241E Flights 差分约束
传送门 差分约束永远是Itst最烂的图论知识点没有之一qwq 先用dfs把在\(1\)到\(N\)的路径上的所有点都拿出来,其他的点和边状态任意都不会影响答案. 然后考虑设\(dis_i\)表示从\( ...
- 题解 CF241E Flights
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度 ...
- 【CF241E】Flights(差分约束)
[CF241E]Flights(差分约束) 题面 CF 有\(n\)个点\(m\)条边,要求给每条边赋一个\(1\)或\(2\)的边权,判断能否使得每一条\(1\)到\(n\)的路径的权值和都相等,如 ...
- 【CF241E】Flights
[CF241E]Flights 题面 洛谷 题解 对于原来的图,如果一条边不出现在\(1\)到\(n\)的路径上面,直接\(ban\)掉即可. 那么考虑一条边\(u\rightarrow v\),一定 ...
- 「CF241E」Flights
传送门 Luogu 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的. 对于所有在路径上的边 \((u,v)\) 满足 \(1\le dis_v-dis_u\le2\) 差分约束即可. ...
- 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 ...
- (中等) 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 ...
- [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 ...
随机推荐
- python计算最大公约数和最小公倍数
a=4 b=2 def gcd(a,b): return a if b==0 else gcd(b,a%b) def lcm(a,b): return a*b//gcd(a,b) print(gcd( ...
- 用nodejs做一下发送邮件例子
var nodemailer = require("nodemailer"); var transport = nodemailer.createTransport("S ...
- oracle查询重复数据方法
SQL重复记录查询方法 2008年08月14日 星期四 21:01 SQL重复记录查询 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peop ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- CSS高度塌陷问题解决方案
高度塌陷的存在:原因分析 1 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /& ...
- centos6.5环境disconf管理端安装配置详解
操作系统:centos6.5 x86_64 安装目录/data 1.安装nginx1.10.1 rpm -ivh http://nginx.org/packages/centos/6/noarch/R ...
- spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
关于jdbctemplate: 个人感觉比Java链接mysql那一套方便好维护多了,只需在配置文件维护即可 需要的包: com.springsource.net.sf.cglib-2.2.0.jar ...
- js发送get 、post请求的方法简介
POST请求: 发送的参数格式不同,请求头设置不同,具体参照 Http请求中请求头Content-Type讲解 发送的参数格式不同,后台获取方式也不相同 php请看 php获取POST数据的三种方法 ...
- Webpack devServer中的 proxy 实现跨域
Webpack dev server使用http-proxy解决跨域问题 文档资料 webpack关于webpack-dev-server开启proxy的官方介绍Vue-cli proxyTable ...
- (二)使用CXF开发WebService服务器端接口
CXF作为java领域主流的WebService实现框架,Java程序员有必要掌握它. CXF主页:http://cxf.apache.org/ 简介:百度百科 今天的话,主要是用CXF来开发下Web ...