BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed
BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed
Description
有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类:
1. 给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb
2. 给出c,d (1<=c,d<=n),要求满足Xc <= Xd
在满足所有限制的条件下,求集合{Xi}大小的最大值。
Input
第一行三个正整数n, m1, m2 (2<=n<=600, 1<=m1+m2<=100,000)。
接下来m1行每行两个正整数a,b (1<=a,b<=n),表示第一类限制。
接下来m2行每行两个正整数c,d (1<=c,d<=n),表示第二类限制。
Output
一个正整数,表示集合{Xi}大小的最大值。
如果无解输出NIE。
Sample Input
1 2
3 4
1 4
3 1
Sample Output
3
先正常差分约束建图,将得到的图缩点。
可以发现每个强连通分量之间互不影响,也就是可以直接加在一起。
然后强联通分量内部求一个最长路,最长路就是合法的方案中最大的数减最小的数的最大值,这个加一就是每个强联通分量的答案。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 650
#define M 200050
int head[N],to[M],nxt[M],cnt,n,val[M],S[N],dfn[N],low[N],ins[N],from[M],m1,m2;
int bl[N],scc,f[N][N],tot,top;
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w; from[cnt]=u;
}
void dfs(int x) {
S[++top]=x; ins[x]=1; dfn[x]=low[x]=++tot;
int i;
for(i=head[x];i;i=nxt[i]) {
if(!dfn[to[i]]) {
dfs(to[i]);
low[x]=min(low[x],low[to[i]]);
}else if(ins[to[i]]) {
low[x]=min(low[x],dfn[to[i]]);
}
}
if(dfn[x]==low[x]) {
int t=S[top--];
bl[t]=++scc; ins[t]=0;
while(t!=x) {
t=S[top--]; bl[t]=scc; ins[t]=0;
}
}
}
void floyd() {
int i,j,k;
for(k=1;k<=n;k++) {
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
}
int main() {
scanf("%d%d%d",&n,&m1,&m2);
int i,x,y,j,k;
for(i=1;i<=m1;i++) {
scanf("%d%d",&x,&y);
add(x,y,1); add(y,x,-1);
}
for(i=1;i<=m2;i++) {
scanf("%d%d",&x,&y);
add(y,x,0);
}
for(i=1;i<=n;i++) add(0,i,0);
for(i=1;i<=n;i++) if(!dfn[i]) {
dfs(i);
}
memset(f,0x3f,sizeof(f));
for(i=1;i<=cnt;i++) {
f[from[i]][to[i]]=min(f[from[i]][to[i]],val[i]);
}
for(i=1;i<=n;i++) f[i][i]=0;
int ans=0;
floyd();
for(i=1;i<=n;i++) if(f[i][i]<0) {
puts("NIE"); return 0;
}
for(i=1;i<=scc;i++) {
int re=0;
for(j=1;j<=n;j++) {
for(k=1;k<=n;k++) {
if(bl[j]==i&&bl[k]==i) {
//printf("%d\n",f[j][k]);
re=max(re,f[j][k]);
}
}
}
ans+=re+1;
}
printf("%d",ans);
}
BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed的更多相关文章
- [Poi2012]Festival 差分约束+tarjan
差分约束建图,发现要在每个联通块里求最长路,600,直接O(n3) floyed #include<cstdio> #include<cstring> #include< ...
- bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd
题目大意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1.给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2.给出c,d (1&l ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 【题解】 [POI2012]FES-Festival (差分约束)
懒得复制题面,戳我戳我 Question: (因为网上找不到好的翻译,这里简单复述一下) 告诉你\(m1+m2\)个约束条件,然后要你找出\(X_1-X_n\)这些数字,求满足要求的数列中不同的数字个 ...
- BZOJ2330 糖果[差分约束方案+spfa?/tarjan]
以往对于差分约束理解不是太深,导致这题屡次被坑,在此记录一下细节的理解. 差分约束实际上就是利用了spfa的一个特性:只要有$dis_y>dis_x+w_{x,y}$就松弛,直到所有边关系都满足 ...
- 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...
- [luogu2474 SCOI2008]天平(floyd差分约束)
传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...
- 洛谷2474 [SCOI2008] 天平 差分约束->枚举
题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...
- BZOJ4383 [POI2015]Pustynia[线段树优化建边+拓扑排序+差分约束]
收获挺大的一道题. 这里的限制大小可以做差分约束,从$y\to x$连$1$,表示$y\le x-1$即$y<x$,然后跑最长路求解. 但是,如果这样每次$k+1$个小区间每个点都向$k$个断点 ...
随机推荐
- nodejs实现最简单的爬虫
本文将以抓取百度搜索结果中关键词的相关搜索为例子,教会大家以nodejs制作最简单的爬虫: 开始之前呢,先来个公众号求粉: 将使用的node模块及属性介绍: request: ...
- Linux笔记2
touch 创建文件. echo 输出 >> 将输出写入到文件中 echo sss >> a.txt cat 查看文件内容 帮助命令 man 命令 man ...
- eclipse中英文(等各国语言)版本转换发放
eclipse界面语言的切换方法 1.该方法只支持安装过中文包的eclipse(其实中文包中几乎包含了全世界所有的语言,只是调用了其中的中文简体而已) 2.在桌面的快捷方式中目标的地址后面加上参数-n ...
- contentType,charset和pageEncoding的区别
简单点总结就是jsp页面头上这样写 <%@ page contentType="text/html;charset=GBK" %> 页面用GBK编码 pageEnco ...
- redis主从,哨兵回忆手册
redis主从 持久化的开启与主从集群是否生效无关系 Slave Server同样是以非阻塞的方式完成数据同步.在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据(注意初次同步则会阻 ...
- 利用truffle与智能合约进行交互
先了解相关指令,再观看比较合适:http://truffle.tryblockchain.org/ 安装: 先完成上一条博客的安装,再来进行下面的操作:http://www.cnblogs.com/t ...
- 【转】学习FFmpeg API – 解码视频
ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...
- 关于Android适配华为等带有底部虚拟按键的解决方案
http://blog.csdn.NET/a91694451/article/details/50469857 最近公司的项目里遇到了一个问题,就是最后适配的时候时候同事的华为手机时,由于底部带有虚拟 ...
- 如何使你的Ajax应用内容可让搜索引擎爬行
This document outlines the steps that are necessary in order to make your AJAX application crawlable ...
- va_start,va_arg,va_end的使用
一.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表. void fun(...); void fun(parm_list,...); #include <stdi ...