差分约束 模板题 找到不等式 建立边 跑spfa(有负权边)如果有负环 则不存在
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int h[N],ne[2*N],e[2*N],w[2*N],idx,co[N],st[N],d[N],n;
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
bool spfa(){
memset(d,0x3f,sizeof d);
d[0]=0;
queue<int> q;
q.push(0);st[0]=1;
while(q.size())
{
auto t=q.front();
q.pop();
st[t]=0;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(d[j]>d[t]+w[i]){
d[j]=d[t]+w[i];
co[j]++;
if(co[j]>=n) return false;
if(!st[j]){
st[j]=1;
q.push(j);
}
}
}
}return true;
}
int main(){
memset(h,-1,sizeof h);
int a0,b0,l0,a1,b1,l1;
cin>>n>>a0>>b0>>l0>>a1>>b1>>l1;
for(int i=1;i<=n;i++)
add(i-1,i,1),add(i,i-1,0);
for(int l=1,r=l0;r<=n;l++,r++)
add(r,l-1,b0-l0),add(l-1,r,l0-a0);
for(int l=1,r=l1;r<=n;l++,r++)
add(r,l-1,-a1),add(l-1,r,b1);
if(spfa())
for(int i=1;i<=n;i++)
cout<<d[i]-d[i-1];
else cout<<-1<<endl;
return 0;
}