地址:
点击打开链接
这个题目用到了spfa,最好还是先看看spfa,之前碰到的时候,我都会绕开spfa,理解的难点也都在spfa上,至于差分约束系统,可以看这里
点击打开链接
代码如下:
#include<iostream>
#include<string.h>
#include<queue>
#define MAX 50010
using namespace std;
struct edge
{
int x,value,next;
}e[4*MAX];
int head[MAX],d[MAX],a,b,cnt;
bool visited[MAX];
void add(int u,int v,int w)
{
e[cnt].x=v;
e[cnt].value=w;
e[cnt].next=head[u];
head[u]=cnt++;
}
void SPFA()
{
int temp,tnext,tx;
memset(visited,false,sizeof(visited));
memset(d,-50000,sizeof(d));
queue<int>Q;
while(!Q.empty()) Q.pop();
Q.push(a);
d[a]=0;visited[a]=true;
while(!Q.empty())
{
temp=Q.front();Q.pop();
tnext=head[temp];
while(tnext!=-1)
{
tx=e[tnext].x;
if(d[tx]<d[temp]+e[tnext].value)
{
d[tx]=d[temp]+e[tnext].value;
if(!visited[tx])
{
Q.push(tx);
visited[tx]=true;
}
}
tnext=e[tnext].next;
}
visited[temp]=false;//用于再次入栈,visited每次是为了防止已经入栈的再次入栈,同时,保证入栈了的还有多次更新的机会。
}
}
int main()
{
int n,u,v,w,i;
while(cin>>n)
{
a=MAX;b=0;cnt=0;
for(i=0;i<MAX;i++) head[i]=-1;
for(i=0;i<n;i++)
{
cin>>u>>v>>w;
if(a>u) a=u;
if(b<v+1) b=v+1;
add(u,v+1,w);
}
for(i=a;i<=b;i++)
{
add(i,i-1,-1);
add(i-1,i,0);
}
SPFA();
cout<<d[b]<<endl;
}
return 0;
}