题目描述
题目大意:有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