差分约束
题目描述
给出一组包含
的不等式组,求任意一组满足这个不等式组的解。
分析
考虑每个不等式类似最短路中的三角不等式,所以我们可以对该不等式组建图。
具体的,可将每个变量看成一个顶点,并设一个超级源点
无论是最短路还是最长路都可以解决本题,我选择最长路。但是此时要考虑正环的情况。
在拓扑时我们记录一个
Code
点击查看代码
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
return w*s;
}
int n,m;
int head[900100],len,dis[900100],tot[900100];
struct no
{
int y,v,nxt;
}edge[900100];
void add(int a,int b,int c)
{
edge[++len].y=b;
edge[len].nxt=head[a];
edge[len].v=c;
head[a]=len;
}
bool vis[900100];
queue<int> q;
bool bfs(int u)
{
memset(vis, 0, sizeof vis);
memset(dis, -1, sizeof dis);
memset(tot, 0, sizeof tot);
vis[u]=1;
dis[u]=0;
tot[u]=1;
q.push(u);
while (q.size())
{
u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u];i; i =edge[i].nxt)
{
int y=edge[i].y;
int v=edge[i].v;
if (dis[y]<dis[u]+v)
{
dis[y]=dis[u]+v;
if (!vis[y])
{
q.push(y);
vis[y]=1;
if (++tot[y]>n+1)
return 1;
}
}
}
}
return false;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) add(0,i,0);
for(int i=1;i<=m;i++)
{
int a=read();int b=read();int c=read();
add(a,b,-c);
}
if(bfs(0)) cout<<"NO";
else for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】