[POI2012]Festival
题目大意:
有$n$个正整数$x_1,x_2,\ldots,x_n$,再给出一些限制条件,限制条件分为两类:
1.给出$A,B$,要求满足$X_A+1=X_B$;
2.给出$C,D$,要求满足$X_C\leq X_D$。
其中第1类限制条件有$m_1$个,第2类限制条件有$m_2$个。
问这些限制条件是否能都被满足,如果能,求集合$\{x_i\}$大小的最大值。
思路:
不难想到这是一个差分约束模型。
对于第1类限制,连一条权值为$1$的边$A\to B$,和一条权值为$-1$的边$B\to A$。
对于第2类限制,连一条权值为$0$的边$C\to D$。
这种连边方法很经典,难点在于连边以后如何求出集合大小的最大值。
对于同一个SCC,我们只要跑一下最长路就可以唯一确定当前SCC的权值集合大小,因此我们可以先跑一遍Tarjan,然后Floyd求最长路。
考虑不同SCC的关系。
Tarjan缩完点以后就变成了一个DAG,且DAG上的边一定对应第2类限制(不然一定对称,就变成SCC了)。
我们不妨假设不同SCC中的权值互不重叠,那么我们只需要将所有SCC的答案加起来即可。
#include<stack>
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
const int N=;
struct Edge {
int to,w;
};
bool ins[N];
std::stack<int> s;
std::vector<Edge> e[N];
int dis[N][N],low[N],dfn[N],scc[N];
inline void add_edge(const int &u,const int &v,const int &w) {
e[u].push_back((Edge){v,w});
}
void tarjan(const int &x) {
low[x]=dfn[x]=++dfn[];
s.push(x);
ins[x]=true;
for(unsigned i=;i<e[x].size();i++) {
const int &y=e[x][i].to;
if(!dfn[y]) {
tarjan(y);
low[x]=std::min(low[x],low[y]);
} else if(ins[y]) {
low[x]=std::min(low[x],dfn[y]);
}
}
if(low[x]==dfn[x]) {
scc[]++;
int y=;
while(y!=x) {
ins[y=s.top()]=false;
s.pop();
scc[y]=scc[];
}
}
}
int main() {
const int n=getint(),m1=getint(),m2=getint();
for(register int i=;i<=n;i++) {
for(register int j=;j<=n;j++) {
if(i!=j) {
dis[i][j]=-inf;
}
}
}
for(register int i=;i<m1;i++) {
const int u=getint(),v=getint();
add_edge(u,v,);
add_edge(v,u,-);
dis[u][v]=std::max(dis[u][v],);
dis[v][u]=std::max(dis[v][u],-);
}
for(register int i=;i<m2;i++) {
const int u=getint(),v=getint();
add_edge(u,v,);
dis[u][v]=std::max(dis[u][v],);
}
for(register int i=;i<=n;i++) {
if(!dfn[i]) {
tarjan(i);
}
}
int ans=;
for(register int c=;c<=scc[];c++) {
for(register int k=;k<=n;k++) {
if(scc[k]!=c) continue;
for(register int i=;i<=n;i++) {
if(scc[i]!=c||dis[i][k]==-inf) continue;
for(register int j=;j<=n;j++) {
if(scc[j]!=c||dis[k][j]==-inf) continue;
dis[i][j]=std::max(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
int tmp=;
for(register int i=;i<=n;i++) {
if(scc[i]!=c) continue;
for(register int j=;j<=n;j++) {
if(scc[j]!=c) continue;
tmp=std::max(tmp,std::abs(dis[i][j]));
}
}
ans+=tmp+;
}
for(register int i=;i<=n;i++) {
if(dis[i][i]) {
puts("NIE");
return ;
}
}
printf("%d\n",ans);
return ;
}
[POI2012]Festival的更多相关文章
- [BZOJ2788][Poi2012]Festival
2788: [Poi2012]Festival Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 187 Solved: 91[Submit][Statu ...
- [Poi2012]Festival 题解
[Poi2012]Festival 时间限制: 1 Sec 内存限制: 64 MB 题目描述 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1 ...
- [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 ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2795: [Poi2012]A Horrible Poem
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 484 Solved: 235[Subm ...
- [BZOJ2803][Poi2012]Prefixuffix
2803: [Poi2012]Prefixuffix Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 219 Solved: 95[Submit][St ...
随机推荐
- 洛谷P1331海战
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线. 不幸的是因为种种原因,国防海军部仅有很少的 ...
- LDA学习笔记
线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的线性学习方法.其思想非常朴素,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近,异类的样例的投 ...
- 系统编程--标准IO
1.流和FILE对象 对于国际字符集,一个字符可以由一个以上的字节来表示.标准I/O文件流可以用来操作单字节和多字节(宽,wide)字符集.一个流的方向(orientation)决定了字符是以单字节还 ...
- VC调试篇:ASSERT(FALSE)时怎么办?查看调用堆栈
问题简述 我们在调试程序时,经常会遇到程序中断的情况,就像下图这样. 我艹,这该怎么办,我们一下子就懵逼了.我们选择中断,常常会跳到一个莫名其妙的地方去. 正是这个断言 ASSERT(::IsWind ...
- 201621123033 《Java程序设计》第3周学习总结
第三周作业 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1 ...
- LINQ to Entities 不识别方法“System.Guid Parse(System.String)”,因此该方法无法转换为存储表达式。
LINQ to Entities 不识别方法"System.Guid Parse(System.String)",因此该方法无法转换为存储表达式. linq 中不能转换类型
- Linux运维文档之nginx
NGINX安装配置1.检查并且安装依赖组件检查安装nginx的依赖性,nginx的模块需要第三方库的支持,检查是否安装下列库:zlib.zlib-devel.openssl.openssl-devel ...
- jquery 的ajax
一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...
- 浅谈android Socket 通信及自建ServerSocket服务端常见问题
摘 要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...
- HDU3068 最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...