CF1450E Capitalism - 差分约束系统 - 最短路 -
题目链接:https://codeforces.com/contest/1450/problem/E
题解:
题目中的等式关系为 和
首先,等式关系不好处理,考虑化成不等式
第一种: 且
第二种: 且 且
发现这就是三角形不等式,可以将 等价于源点到 的最短距离
就可以等价于 连了一条长度为 的有向边
因此可以将等式关系对应的图建出来。
此时注意到,如果 的话,一、二种条件均不满足,此时无解。又注意到 是原图的边,因此这个条件就可以等价于原图不是二分图则无解
同样的,如果图中有负环的话,显然也是无法构造出来 的
如何让极差最大?一个重要的观察是发现极差是有上界的,因为 (否则显然可以更新 )。那这个上界能否取到呢?如果我们把 当做源点跑最短路,那么 ,此时就能取到上界。因此跑 floyd,找到 最大的 ,那么将 当做源点, 即可
小细节:判负环可以直接用 ,判二分图可以用 ()
// by SkyRainWind
#include <bits/stdc++.h>
#define mpr make_pair
#define debug() cerr<<"Yoshino\n"
#define pii pair<int,int>
#define pb push_back
using namespace std;
typedef long long ll;
typedef long long LL;
const int inf = 1e9, INF = 0x3f3f3f3f, maxn = 205;
int n,m;
vector<pii>g[maxn];
int dis[maxn][maxn];
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,b;scanf("%d%d%d",&x,&y,&b);
// a_y=a_x+1 -> a_y-a_x <= 1 && a_x-a_y <= -1
if(b == 0)g[x].pb(mpr(y, 1)), g[y].pb(mpr(x, 1));
else g[x].pb(mpr(y, 1)), g[y].pb(mpr(x, -1));
}
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=n;i++)
dis[i][i] = 0;
for(int i=1;i<=n;i++)
for(auto j : g[i])dis[i][j.first] = j.second;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
for(int i=1;i<=n;i++)
if(dis[i][i] < 0) // 判负环
return puts("NO"), 0;
int res = -INF, r;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
for(auto k : g[j])
if(dis[i][k.first] == dis[i][j]) // 判二分图
return puts("NO"), 0;
if(dis[i][j] > res)
res = dis[i][j],
r = i;
}
puts("YES");
int mx = -INF, mn = INF;
for(int i=1;i<=n;i++)mx = max(mx, dis[r][i]), mn = min(mn, dis[r][i]);
printf("%d\n",mx-mn);
int ans = 0;
for(int i=1;i<=n;i++)
printf("%d ",dis[r][i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示