[Poi2012]Festival

时间限制: 1 Sec  内存限制: 64 MB

题目描述

有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}大小的最大值。

输入

第一行三个正整数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),表示第二类限制。

输出

一个正整数,表示集合{Xi}大小的最大值。

如果无解输出NIE。

样例输入

4 2 2

1 2

3 4

1 4

3 1

样例输出

3

提示

|X3=1, X1=X4=2, X2=3

这样答案为3。容易发现没有更大的方案。

  先膜拜一下Q某犇,他给我讲的这道题。

  这道题基本一看就是差分约束,建边已经是套路了,问题在于如何乱搞找出正解。首先,我们可以看出每一个强联通分量对答案的贡献与其他强联通分量无关,因为他们之间建边的话只能是某几个单向的0边,又因为Xi无限制,所以完全是可以对每个强联通分量单独结算在合并的。

  那么我们怎么求在单个强联通分量的最大大小呢?floyd最长路就好了。反正n<=600这道题想卡你的话貌似也不太容易,因此我们大可将每个强联通分量中的点建一个链表,复杂度就大大降低了。

  而有没有接嘛,只要看跑完floyd之后dis[i][i]是否为0就好了。

  

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
#define N 750
using namespace std;
int n,m1,m2;
int zz,dis[N][N];
bool rz[N],rz2[N];
int dfn[N],low[N],st[N],zz2,top;
int be[N],zz3,pre[N];
int mx[N];
void tar(int x){
zz2++;
dfn[x]=low[x]=zz2;
rz[x]=rz2[x]=;
top++;
st[top]=x;
for(int i=;i<=n;i++)
{
if(dis[x][i]!=dis[][]&&i!=x)
{
if(!rz2[i])
{
tar(i);
low[x]=min(low[x],low[i]);
}
else if(rz[i])
{
low[x]=min(low[x],dfn[i]);
}
}
}
if(low[x]==dfn[x])
{
zz3++;
int v,la=;
do{
v=st[top];
top--;
rz[v]=;
if(!be[zz3])
be[zz3]=v;
pre[la]=v;
la=v;
}while(dfn[v]!=low[v]);
}
}
int main(){
memset(pre,-,sizeof(pre));
scanf("%d%d%d",&n,&m1,&m2);
memset(dis,-0xf,sizeof(dis));
for(int i=;i<=m1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
dis[x][y]=max(dis[x][y],);
dis[y][x]=max(-,dis[y][x]);
}
for(int i=;i<=m2;i++)
{
int x,y;
scanf("%d%d",&x,&y);
dis[x][y]=max(dis[x][y],);
}
for(int i=;i<=n;i++)
{
if(!rz2[i])
{
tar(i);
}
} for(int i=;i<=n;i++)
{
dis[i][i]=;
}
for(int o=;o<=zz3;o++)
{
for(int k=be[o];k!=-;k=pre[k])
{
for(int i=be[o];i!=-;i=pre[i])
{
for(int j=be[o];j!=-;j=pre[j])
{
if(abs(dis[i][k])<=n&&abs(dis[k][j])<=n)
dis[i][j]=max(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
for(int i=be[o];i!=-;i=pre[i])
{
for(int j=be[o];j!=-;j=pre[j])
mx[o]=max(mx[o],abs(dis[i][j]));
}
}
for(int i=;i<=n;i++)
{
if(dis[i][i]!=)
{
printf("NIE\n");
exit();
}
} int ans=;
for(int i=;i<=zz3;i++)
ans+=mx[i]+;
printf("%d\n",ans);
// while(1);
return ;
}

[Poi2012]Festival 题解的更多相关文章

  1. [BZOJ2788][Poi2012]Festival

    2788: [Poi2012]Festival Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 187  Solved: 91[Submit][Statu ...

  2. [Poi2012]Festival 差分约束+tarjan

    差分约束建图,发现要在每个联通块里求最长路,600,直接O(n3) floyed #include<cstdio> #include<cstring> #include< ...

  3. Hdoj 1850.Being a Good Boy in Spring Festival 题解

    Problem Description 一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄给爸爸买个小礼物 主动地 强烈地 要求洗一次碗 某一天早 ...

  4. [POI2012]Festival

    题目大意: 有$n$个正整数$x_1,x_2,\ldots,x_n$,再给出一些限制条件,限制条件分为两类: 1.给出$A,B$,要求满足$X_A+1=X_B$: 2.给出$C,D$,要求满足$X_C ...

  5. 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 ...

  6. AT2202 硬度フェスティバル / Kode Festival 题解

    Content 有 \(2^n\) 块石头,第 \(i\) 块石头硬度为 \(a_i\).重复执行以下操作直到只剩下一块石头为止: 让当前编号为 \((1,2)\).\((3,4)\).-- 的石头互 ...

  7. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

  8. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Linux ssh密钥自动登录 专题

    在开发中,经常需要从一台主机ssh登陆到另一台主机去,每次都需要输一次login/Password,很繁琐.使用密钥登陆就可以不用输入用户名和密码了 实现从主机A免密码登陆到主机B(即把主机A的pub ...

  2. Win8Metro(C#)数字图像处理--2.34直方图规定化

    原文:Win8Metro(C#)数字图像处理--2.34直方图规定化  [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...

  3. Redis实现关注关系

    最近使用关系型数据库实现了用户之间的关注,于是思考换一种思路,使用Redis实现用户之间的关注关系. 综合考虑了一下Redis的几种数据结构后,觉得可以用集合实现一下. 假设"我" ...

  4. SQLSERVER使用密码加密备份文件以防止未经授权还原数据库

    原文:SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 在备份数据库的时候,用户可以为媒体集.备份集或两者指定密码 在ba ...

  5. [转] Protobuf高效结构化数据存储格式

    从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么?  Goo ...

  6. [转]深入Android内存泄露

    深入内存泄露 Android应用的内存泄露,其实就是java虚拟机的堆内存泄漏. 当然,当应用有ndk,jni时,没有及时free,本地堆也会出现内存泄漏. 本文只是针对JVM内存泄漏应用,进行阐述分 ...

  7. 使用网盘(Dropbox/Google Drive)同步Git仓库

    还在使用老掉牙的U盘搬运代码(文件)的方式,从一台机器上复制后,粘贴到另一台机器上?太Out了.使用Github 倒是一个非常不错的替代方法.但无论是基于什么理由都有可能不想把代码公开(毕竟Githu ...

  8. GO :互联网时代的 C 语言!

    摘要: 每周为您推送最有价值的开源技术内参! 技术干货 标签:独家译文 1.Go 很好,为什么我们不使用它? 在这篇文章中,我将分享一下为什么我认为它很棒,使用它的一些缺点,以及为什么它还不是我们 Z ...

  9. mysql自动安装教程说明

    这里只说明了思路和方法 我们在安装程序里面可能需要安装的时候将mysql一起安装,那么我们就按照下面的顺序思路来. 首先我们安装的电脑上可能已经安装了mysql,所以我们的mysql服务就起一个名字, ...

  10. jquery 之load post get

    load() 方法从服务器加载数据,并把返回的数据放入被选元素中 load(url,data,fun(responseTxt ,responseTxt,xhr ){}) 必需的 URL 参数规定您希望 ...