1509 Intervals
很明显这是一个差分约束的题目
求满足多个不等式的条件的东西,可以把不等式转换成图论中最短路问题然后进行松弛
这是一个很标准的差分约束系统问题
要求的不等式条件是:s[b[i]]-s[a[i]-1]≥c[i],其中s数组表示当前位置为止选择的个数
然后转换一下
s[b[i]] ≥ s[a[i]-1]+c[i]
s[i] ≥ s[i-1]+0
s[i-1] ≥ s[i]+(-1)
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=5e4+10;
const int INF=0x3fffffff;
typedef long long LL;
//差分约束系统标准题
int head[maxn],dis[maxn],vis[maxn];
struct node
{
int to,dis,next;
}ed[maxn*2];
int cnt,n;
void add(int x,int y,int z)//邻接表建图
{
ed[++cnt].dis=z;
ed[cnt].to=y;
ed[cnt].next=head[x];
head[x]=cnt;
}
queue<int> q;
void spfa(int st)
{
for(int i=1;i<=n;i++) dis[i]=-INF;
//因为是求最长路
dis[st]=0;
q.push(st);
vis[st]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=0;
for(int i=head[t];i;i=ed[i].next)
{
int op=ed[i].to;
if(dis[op]<dis[t]+ed[i].dis)//建立最长路
{
dis[op]=dis[t]+ed[i].dis;
if(!vis[op])
{
vis[op]=1;
q.push(op);
}
}
}
}
}
int main(){
scanf("%d",&n);
int x,y,z;
int st=INF,ed=-INF;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&z);
add(x-1,y,z); //建边
st=min(st,x-1); //记得减一
ed=max(ed,y);
}
for(int i=st;i<=ed;i++)
{
add(i-1,i,0);//差分建边,这个建边是根据不等式进行建边
add(i,i-1,-1);
}
spfa(st);
printf("%d\n",dis[ed]);
return 0;
}
本文解析了如何将差分约束问题转化为图论中的最短路径问题,并通过实例展示了如何使用C++实现SPFA算法求解满足条件的s数组。重点在于理解不等式转换和邻接矩阵构建的过程。
606

被折叠的 条评论
为什么被折叠?



