CF241E Flights 题解
做了一下这道题,突然发现自己忘了差分约束,赶紧复习一下。
设当前有n个变量 a1,a2,...,an ,有若干组限制形如 ai≤aj+k (其中k为常数),则由点j向点i连一条边权为k的边,再从某一确定的变量出发跑最短路(如若a1=0,则设dis1=0,从点1出发跑最短路),得到的disi即为ai的最大值。类似的,若把上面的小于等于改成大于等于,跑最长路,就可以得到每个点的最小值。若跑最短路时出现了负环(最长路正环),则说明无解。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 200007
int h1[N],pre[N],to[N],num,dis[N],h2[N],h3[N],w[N],f[N],n,m;
int id[N],ans[N];
bool tag1[N],tag2[N],tag[N],vis[N];
queue<int> q;
void add1(int x,int y,int z)
{
num++;pre[num]=h1[x];h1[x]=num;to[num]=y;id[num]=z;
}
void add2(int x,int y)
{
num++;pre[num]=h2[x];h2[x]=num;to[num]=y;
}
void add3(int x,int y,int z)
{
num++;pre[num]=h3[x];h3[x]=num;to[num]=y;w[num]=z;
}
bool spfa(int s)
{
int v,i,u;
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
dis[s]=;f[s]=;
q.push(s);
while(!q.empty())
{
v=q.front();q.pop();
vis[v]=false;
for(i=h3[v];i;i=pre[i])
{
u=to[i];
if(dis[v]+w[i]<dis[u])
{
dis[u]=dis[v]+w[i];
f[u]=f[v]+;
if(f[u]>=n+)return false;
if(!vis[u])
{
q.push(u);
vis[u]=true;
}
}
}
}
return true;
}
void dfs1(int v)
{
int i,u;
tag1[v]=true;
for(i=h1[v];i;i=pre[i])
{
u=to[i];
if(tag1[u])continue;
dfs1(u);
}
}
void dfs2(int v)
{
int i,u;
tag2[v]=true;
for(i=h2[v];i;i=pre[i])
{
u=to[i];
if(tag2[u])continue;
dfs2(u);
}
}
int main()
{
int i,x,y,j,u,v;
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add1(x,y,i),add2(y,x);
}
dfs1(),dfs2(n);
for(i=;i<=n;i++)
if(tag1[i]&&tag2[i])
tag[i]=true;
for(v=;v<=n;v++)
for(i=h1[v];i;i=pre[i])
{
u=to[i];
if(tag[v]&&tag[u])
{
add3(v,u,-);
add3(u,v,);
}
}
if(!spfa(n))printf("No\n");
else
{
printf("Yes\n");
for(v=;v<=n;v++)
for(i=h1[v];i;i=pre[i])
{
u=to[i];
if(tag[u]&&tag[v])ans[id[i]]=dis[v]-dis[u];
else ans[id[i]]=;
}
for(i=;i<=m;i++)
printf("%d\n",ans[i]);
}
return ;
}
CF241E Flights 题解的更多相关文章
- [CF241E]Flights
[CF241E]Flights 题目大意: 给一张\(n(n\le1000)\)个点\(m(m\le5000)\)条边的DAG,确定每条边的边权\(w_i(w_i\in\{1,2\})\),使得所有从 ...
- 题解 CF241E Flights
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的 \(\texttt{DAG}\) ,给每条边设定边权为 \(1\) 或者 \(2\) ,使得 \(1\to n\) 的每条路径长度 ...
- CodeForces - 241E Flights 题解
题目大意: 有一个有向无环图,n个点m条边,所有边权为1或2,求一组使所有从1到n的路径长度相同的边权的方案. 思路: 设从1到i的最短路为dist[i],若有一条从x到y的边,则1<=dist ...
- CF241E Flights 差分约束
传送门 差分约束永远是Itst最烂的图论知识点没有之一qwq 先用dfs把在\(1\)到\(N\)的路径上的所有点都拿出来,其他的点和边状态任意都不会影响答案. 然后考虑设\(dis_i\)表示从\( ...
- 【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\) 差分约束即可. ...
- 题解 CF576D 【Flights for Regular Customers】
对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...
- 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 ...
随机推荐
- SQL Server 事务日志截断、回绕与收缩(转载)
每个 SQL Server 数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改. 必须定期截断事务日志以避免它被填满. 但是,一些因素可能延迟日志截断,因此监视日志大小很重要. 某些 ...
- azure跨域问题(访问azure存储账户数据,blob)
访问azure存储账户数据报错:405错误 解决方案 打开访问的存储账户--->CORS--->Blob服务 全部填写*就可以了,点击“保存”即可. iframe就可以展示blob中的pd ...
- 2019 思贝克java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.思贝克等公司offer,岗位是Java后端开发,因为发展原因最终选择去了思贝克,入职一年时间了,也成为了面试官 ...
- Mybatis映射器接口代理对象的方式 运行过程
查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 1.pom.xml <?xml version="1.0" ...
- kaishi
https://zjc.wtc.edu.cn/zs/2019/0623/c2937a54869/page.htm https://zjc.wtc.edu.cn/zs/2019/0614/c593a54 ...
- 阿里sentinel源码研究深入
1. 阿里sentinel源码研究深入 1.1. 前言 昨天已经把sentinel成功部署到线上环境,可参考我上篇博文,该走的坑也都走了一遍,已经可以初步使用它的限流和降级功能,根据我目前的实践,限流 ...
- 手表WACCHE单词WACCHE腕表
中文名:手表 外文名:watch,wacche 佩戴部位:手腕 拼音:shǒu biǎo 含义 1.戴在手腕上的小型计时器. 茅盾<夏夜一点钟>:“‘哼哼,这家伙!骗人的!’--她本能地校 ...
- Spring+SpringMVC+Hibernate 与 shiro 整合步骤
目录 1. 业务需求分析 2. 创建数据库 3. 创建 maven webapp 工程 4. 创建实体类(POJO) 5. 配置 Hibernate 和 Mapping 5.1 Hibernate 主 ...
- nginx配置ssl证书流程及常见问题
背景: 项目开发中用到了微信小程序,但是服务器配置URL必须是HTTPS,所以需要通过配置nginx的SSL模块来支持HTTPS访问,也就是说,要做一个网站域名为 dmsdbj.com ...
- 《linux就该这么学》课堂笔记12 网卡配置、防火墙配置
1.网卡配置(四种方法,选其一即可,配置后须重启网络服务使其生效) 1)修改配置文件./etc/sysconfig/network-scripts/ifcfg-网卡名称 2)nmtui [RHEL7] ...