[BZOJ2788][Poi2012]Festival(差分约束+floyed+tarjan)

该博客介绍了如何使用差分约束、Floyd算法和Tarjan算法解决POI2012的Festival问题。问题要求在满足特定的加法和不等式限制条件下,找出一组正整数的最大集合。博主首先通过差分约束建模,然后用深搜SPFA判断负环以确定问题是否有解。接着,利用Tarjan算法进行强连通分量缩点,最后通过最短路径计算最大取值数。题解链接提供了更详细的证明。
摘要由CSDN通过智能技术生成

题目描述

传送门

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

题解

首先差分约束建图+深搜spfa判断负环->无解
tarjan缩点,不同强连通分量里的点不影响(取值可以没有交集),相同强连通分量里的点的最大取值数为任意两点的最短路的最大值+1
最短路是满足差分约束的条件,可以发现最长的最短路上的点的点权可以按照边权递增,不在这条路上的点的取值一定是它的子集
更科学一点的证明参考popoqqq大爷的题解orz:http://blog.csdn.net/popoqqq/article/details/48249845

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 605
#define E 300005

int n,m1,m2,dfs_clock,top,scc,ans;
int tot,point[N],nxt[E],v[E],c[E];
int dis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值