题意:ai到bi间至少有ci个元素,问所有数中至少有多少元素。额。。。这样好像说不清楚,我拿样例说下吧。
3到7之间至少有3个元素,
8到10之间至少有3个元素,
6到8之间至少有1个元素,
1到3之间至少有1个元素,
10到11之间至少有1个元素。
最少情况如下:
1 2 3 4 5 6 7 8 9 10 11
-- -- -- -- -- --
最少是6个元素才能符合上面所有要求。(上面的只是1种情况)
思路:设前i个数中的元素个数是ai,那么可以列出一下不等式:
a7-a2>=3
a10-a7>=3
a8-a5>=1
a3-a0>=1
a11-a9>=1
光有这些不等式显然是不够的,不过仔细想想,其实还有隐含的条件0<=ai - ai-1<=1。
然后根据这些就可以用差分约束来解了。
ps:代码里的SPFA不完整,因为没有不会有负环所以偷工减料了。。。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int fst[50010],next[150010],node[150010],l[150020];
int n,num,ma,d[50010];
int a,b,c;
bool v[50010];
void SPFA()
{
memset(d,-1,sizeof(d));
d[0]=0;
queue<int>q;
q.push(0);
v[0]=1;
while(!q.empty())
{
a=q.front();
q.pop();
v[a]=0;
for(int i=fst[a];i!=-1;i=next[i])
{
b=node[i];
c=l[i];
if(d[b]<d[a]+c)
{
d[b]=d[a]+c;
if(!v[b])
{
q.push(b);
v[b]=1;
}
}
}
}
cout<<d[ma]<<endl;
}
int main()
{
num=0;
ma=0;
memset(fst,-1,sizeof(fst));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
next[++num]=fst[a-1];
fst[a-1]=num;
node[num]=b;
l[num]=c;
if(b>ma)ma=b;
}
for(int i=0;i<ma;i++)
{
next[++num]=fst[i];
fst[i]=num;
node[num]=i+1;
l[num]=0;
next[++num]=fst[i+1];
fst[i+1]=num;
node[num]=i;
l[num]=-1;
}
SPFA();
return 0;
}