题面:

2788: [Poi2012]Festival

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 418  Solved: 190
[Submit][Status][Discuss]

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

4 2 2

1 2

3 4

1 4

3 1

Sample Output

3

HINT

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

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

很容易发现这是差分约束系统,若为操作1,$u\to v \quad w=1,v\to u\quad w=-1$。

若为操作2,$v\to u \quad w=0$。

然后我们考虑如何统计答案。如果一个环是正环,那么一定不存在答案。

否则我们将图缩点,一个$scc$中最大答案就是其中最长的最短路+1。

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #include <algorithm>
  5 #include <numeric>
  6 using namespace std;
  7 #define maxn 601
  8 #define INF 0x3f3f3f3f
  9 inline int read()
 10 {
 11     int s=0,f=1;
 12     char ch=getchar();
 13     while(ch<'0'||ch>'9')
 14     {
 15         if(ch=='-')
 16             f=-1;
 17         ch=getchar();
 18     }
 19     while(ch>='0'&&ch<='9')
 20         s=s*10+ch-'0',ch=getchar();
 21     return s*f;
 22 }
 23 int n,m1,m2;
 24 int g[maxn][maxn];
 25 int f[maxn][maxn];
 26 int q[maxn],top,dfn[maxn],belong[maxn],low[maxn];
 27 int scc_dfn,scc_cnt,scc_size[maxn];
 28 bool inq[maxn];
 29 void tarjan(int u)
 30 {
 31     q[++top]=u;
 32     inq[u]=true;
 33     low[u]=dfn[u]=++scc_dfn;
 34     for(int i=1;i<=n;i++)
 35     {
 36         if(i!=u&&f[u][i])
 37         {
 38             if(!dfn[i])
 39             {
 40                 tarjan(i);
 41                 low[u]=min(low[i],low[u]);
 42             }
 43             else
 44                 if(inq[i])
 45                     low[u]=min(low[u],dfn[i]);
 46         }
 47     }
 48     if(dfn[u]==low[u])
 49     {
 50         int v=-1;
 51         ++scc_cnt;
 52         while(v!=u)
 53         {
 54             v=q[top--];
 55             inq[v]=false;
 56             belong[v]=scc_cnt;
 57         }
 58     }
 59 }
 60 int ans[maxn];
 61 int main()
 62 {
 63     n=read();
 64     m1=read();
 65     m2=read();
 66     int u,v;
 67     memset(g,0x3f,sizeof(g));
 68     for(int i=1;i<=n;i++)
 69         g[i][i]=0;
 70     for(int i=1;i<=m1;i++)
 71     {
 72         u=read();
 73         v=read();
 74         g[u][v]=min(g[u][v],1);
 75         g[v][u]=min(g[v][u],-1);
 76         f[u][v]=f[v][u]=1;
 77     }
 78     for(int i=1;i<=m2;i++)
 79     {
 80         u=read();
 81         v=read();
 82         g[v][u]=min(g[v][u],0);
 83         f[v][u]=1;
 84     }
 85     for(int k=1;k<=n;k++)
 86         for(int i=1;i<=n;i++)
 87             if(g[i][k]!=INF)
 88                 for(int j=1;j<=n;j++)
 89                     if(g[k][j]!=INF)
 90                         g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
 91     for(int i=1;i<=n;i++)
 92         if(g[i][i]<0)
 93         {
 94             puts("NIE");
 95             exit(0);
 96         }
 97     for(int i=1;i<=n;i++)
 98         if(!dfn[i])
 99             tarjan(i);
100     fill(ans+1,ans+scc_cnt+1,1);
101     for(int i=1;i<=n;i++)
102         for(int j=1;j<=n;j++)
103             if(belong[i]==belong[j]&&i!=j)
104                 ans[belong[i]]=max(ans[belong[i]],g[i][j]+1);
105     printf("%d",accumulate(ans+1,ans+scc_cnt+1,0));
106 }

BZOJ 2788

转载于:https://www.cnblogs.com/radioteletscope/p/7582589.html

BZOJ 2788[Poi2012]Festival相关推荐

  1. bzoj 2803: [Poi2012]Prefixuffix(双Hash)

    2803: [Poi2012]Prefixuffix Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 413  Solved: 167 [Submit] ...

  2. bzoj 2803 [POI2012]prefixuffix hsh+性质

    题目大意 bzoj 2803 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的. 给出一个长度为n的串S,求满 ...

  3. BZOJ 2793: [Poi2012]Vouchers(调和级数)

    Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 582  Solved: 250 [Submit][Status][Discuss] Descripti ...

  4. Loj一本通刷题记录

    夏令营回来后就不知道怎么回事,状态一直不好== 为了让自己不要太颓废,开个坑在noip前把一本通的好题都刷一遍. 如果想要noip拿省一的话,就要开始好好努力了.加油! 为了节省时间,一些比较简单的东 ...

  5. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

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

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

  7. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  8. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  9. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

最新文章

  1. 无需3D运动数据训练,最新人体姿势估计方法达到SOTA | CVPR 2020
  2. mysql等价语句是_Mysql基本语句(个人笔记)
  3. Codeforces 911F Tree Destruction
  4. 3DSlicer28:PLUS
  5. 深度学习中的数据增广
  6. 展望未来计算机可以分为哪几种类型,大学计算机基础-计算机概述.ppt
  7. mysql语句解析_mysql 语句的查询过程解析
  8. 各类手机开发平台介绍(转载)
  9. RENIX软件OSPF和BFD、ISIS和BFD联动测试——网络测试仪实操
  10. 理工科专业精品书系列
  11. 成手指状态html,css手势状态定义属性cursor和自定义鼠标手势详解
  12. 西门子em235模块的功能_与其研究人工智能不如研究可编程控制器之德国西门子PLCS7200...
  13. 基于matlab的Guass-Seidel(高斯--赛德尔) 迭代法求解线性方程组
  14. 2、通信中的交换技术
  15. mysql日期教程_Navicat for MySQL 设置日期时间栏位教程(图文)
  16. Android中dp、sp、px、pt之间的换算关系
  17. 人民大学 环境学院 雷洋(1987-2016)
  18. Windows电脑垃圾清理 - 如何删除临时文件(Temp文件夹)
  19. mysql删除表中数据
  20. 浅析Margin和Padding属性

热门文章

  1. Exadata X2-2 vs EMC Greenplum DCA vs Netezza TwinFin 12主要配置大对比
  2. delphi Bpl 学习杂记
  3. 5月以来的学习,软件工程+设计模式+J2EE开发+portal开发,以及SOA技术
  4. 构建 RESTful Web 服务
  5. Android实现系统关机和重启
  6. 使用 icon 字体图标出现小方块问题
  7. Mysql连接数据库的操作
  8. CentOS Linux 新建oracle数据库实例并连接
  9. XenApp_XenDesktop_7.6实战篇之九:SQL Server数据库服务器规划及部署
  10. 差点吓尿,手贱不要乱点support native debug