#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=10000+5;
const int inf=100000000;
struct edge{
int from,to,dist;
};
struct BellmanFord{
int n,m;
vector<edge> edges;
vector<int> G[maxn];
bool inq[maxn];
int d[maxn];
int p[maxn];
int cnt[maxn];
void init(int n){
this->n=n;
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void addedge(int from,int to,int dist){
edges.push_back((edge){from,to,dist});
m=(int)edges.size();
G[from].push_back(m-1);
}
void spfa(int s){
queue<int> q;
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++) d[i]=-inf;
d[s]=0;
q.push(s);
inq[s]=true;
while(!q.empty()){
int u=q.front();q.pop();
inq[u]=false;
for(int i=0;i<G[u].size();i++){
edge &e=edges[G[u][i]];
if(d[e.to]<d[u]+e.dist){
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
if(!inq[e.to]) {q.push(e.to);inq[e.to]=true;}
}
}
}
}
};
BellmanFord solver;
int n;
int u[maxn],v[maxn],d[maxn];
int main()
{
while(scanf("%d",&n)!=EOF)
{
solver.init(maxn);
int up=0;
for(int i=0;i<n;i++) {
scanf("%d%d",&u[i],&v[i]);up=max(up,v[i]+1);
solver.addedge(u[i],v[i]+1,2);
}
for(int i=1;i<=up;i++) {solver.addedge(i-1,i,0);solver.addedge(i,i-1,-1);}
solver.spfa(0);
printf("%d\n",solver.d[up]);
}
return 0;
}
POJ 1761 Integer Intervals(差分约束系统+BellmanFord)
最新推荐文章于 2017-01-14 10:45:45 发布