题解:AT_abc404_g [ABC404G] Specified Range Sums
终于,我打开了那场比赛,发现,我卡在了 EF,却没做 G,
悲。
看到
此时转化:
很容易发现这是一个非常经典的差分约束,于是直接建图,跑一遍 SPFA 即可。
::::warning[注意]
考虑到
注意判断负环(即无解)情况!!
重中之重,这道题可以使用最长路,就不需要那么麻烦,不过如果使用的是最短路的话,答案也需要乘上
#include<bits/stdc++.h>
using namespace std;
const int N = 4e3+5;
struct node
{
int x;
int w;
};
vector<node>a[N];
long long d[N];
int vis[N];
int num[N];
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m;
cin >> n >> m;
for(int i = 1;i<=n;++i)
{
a[i-1].push_back({i,-1});
}
for(int i = 1;i<=m;++i)
{
int x,y,z;
cin >> x >> y >> z;
a[y].push_back({x-1,z});
a[x-1].push_back({y,-z});
}
for(int i = 0;i<=n;++i)
{
a[n+1].push_back({i,0});
}
memset(d,0x7f,sizeof(d));
queue<int>q;
vis[n+1] = 1;
q.push(n+1);
d[n+1] = 0;
while(q.size())
{
int x = q.front();
q.pop();
vis[x] = 0;
for(node v:a[x])
{
if(d[x]+v.w<d[v.x])
{
d[v.x] = d[x]+v.w;
if(!vis[v.x])
{
vis[v.x] = 1;
q.push(v.x);
++num[v.x];
if(num[v.x] == n+1)
{
cout << -1;
return 0;
}
}
}
}
}
cout << -d[n];
return 0;
}
::::