小 K 的农场(差分约束)
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小 K 的农场(差分约束)相关的知识,希望对你有一定的参考价值。
小 K 的农场
①:对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值
②:对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值
③:a-b==c 建立权值为c的双向边
④:存在负环的话是无解
⑤:求不出最短路(dis[ ]没有得到更新)的话是任意解
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=(int)8e18+100;
const int maxn=5e3+100;
int dis[maxn],num[maxn];
bool vis[maxn];
vector<pii>g[maxn];
int n,m;
bool spfa()
{
for(int i=0;i<=n;i++)dis[i]=inf;
queue<int>q;
dis[0]=0;
vis[0]=1;
num[0]++;
q.push(0);
while(!q.empty())
{
auto now=q.front();
q.pop();
vis[now]=0;
for(auto it:g[now])
{
if(dis[now]+it.se<dis[it.fi])
{
dis[it.fi]=dis[now]+it.se;
if(!vis[it.fi])
{
q.push(it.fi);
vis[it.fi]=1;
num[it.fi]++;
if(num[it.fi]>=n+1)return 0;// 入队次数>=n+1则有负环
}
}
}
}
return 1;
}
signed main()
{
IOS
cin>>n>>m;
for(int i =1;i<=m;i++)
{
int op,x,y,w;
cin>>op;
if(op==3)
{
cin>>x>>y;
g[x].pb({y,0});
g[y].pb({x,0});
}
else if(op==1)
{
cin>>x>>y>>w;
g[x].pb({y,-w});
}
else
{
cin>>x>>y>>w;
g[y].pb({x,w});
}
}
for(int i=1;i<=n;i++)
{
g[0].pb({i,0});
}
bool fg=spfa();
if(fg)cout<<"Yes\\n";
else cout<<"No\\n";
}
以上是关于小 K 的农场(差分约束)的主要内容,如果未能解决你的问题,请参考以下文章