poj1716

题意:在数轴内,给出一些区间,要你在数轴里找一些数出来组成一个集合,使得每个区间中都至少有两个不同的数在这个集合中
解题思路:差分约束,用spfa解的。设d[x]为0到x在集合中的数的个数,那么没输入一个(x,y)就有
d[y]-d[x-1]>=2
又由d[]的性质可知,有
0<=d[i]-d[i-1]<=1
然后建图,我是用向量的,感觉用时很厉害,不过我是卡过去了

982msG++代码:

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
typedef struct edge
{
int next,value;
edge(int a,int b){next=a;value=b;}
}edge;
vector<edge>e[50010];
void add(int x,int y,int value)
{
e[x].push_back(edge(y,value));
}
int d[10010],n;
bool vs[10010];
void spfa(int a)
{
int temp;
queue<int>Q;
memset(vs,false,sizeof(vs));
memset(d,-20000,sizeof(d));
Q.push(a);
d[a]=0;
vs[a]=true;
while(!Q.empty())
{
temp=Q.front();
Q.pop();
int i;
for(i=0;i<e[temp].size();i++)
{
int nx=e[temp][i].next;
if(d[nx]<d[temp]+e[temp][i].value)
{
d[nx]=d[temp]+e[temp][i].value;
if(!vs[nx])
{
Q.push(nx);
vs[nx]=true;
}
}
}
vs[temp]=false;
}
}
int main()
{
int i,j;
int x,y,max;
while(scanf("%d",&n)!=EOF)
{
max=0;
for(i=0;i<=n;i++)
e[i].clear();
for(i=1;i<=n;i++)
{
scanf("%d %d",&x,&y);
if(max<y+1)max=y+1;
add(x,y+1,2);
}
for(i=0;i<=max;i++)
{
add(i-1,i,0);
add(i,i-1,-1);
}
spfa(0);
printf("%d\n",d[max]);
}
return 0;
}

 

你可能感兴趣的:(a)