说一下我的想法
因为对于一组不等式xi−xi≤ki
它的一组解{x1,x2...xn}全都加上n后又是令一组解,因此我们求得所有的最短路,再整体加上一个数,使得加完后最小的数大于等于1(即最少一块糖果)
这样做为啥会wa掉后三个点呢
code
#include <iostream>
#include <cstdio>
#include <cctype>
#include <queue>
#include <algorithm>
#define int long long
using namespace std;
template <typename T>
inline void read(T &x)
{
x = 0;
T f=1;
char c=getchar();
for (;!isdigit(c);c=getchar())
if (c=='-')
f *= -1;
for (;isdigit(c);c=getchar())
x = (x<<1) + (x<<3) + c - '0';
x *= f;
}
const int maxn = 2e6;
int hd[maxn], ecnt;
struct node{
int to, nex, val;
}e[maxn];
inline void adde(int from, int to, int val)
{
e[++ecnt] = node{to, hd[from], val};
hd[from] = ecnt;
}
int f[maxn];
int n, m, a, b, c;
queue <int> q;
bool vis[maxn];
int in[maxn];
long long ans;
int minv = 0x7f7f7f7f;
bool spfa(int x)
{
fill(f, f+maxn, 0x7f7f7f7f);
f[x] = 0;
q.push(x);
while (!q.empty())
{
int u = q.front();q.pop();
vis[u] = 0;
for (int i=hd[u]; i; i=e[i].nex)
{
int to = e[i].to;
if (f[to] > f[u] + e[i].val)
{
f[to] = f[u] + e[i].val;
if (!vis[to])
{
if (in[to]++ > n)
return false;
q.push(to);
vis[to] = 1;
}
}
}
}
return true;
}
signed main ()
{
//freopen("C://Users//19637//Downloads//P3275_8.in","r",stdin);
read(n),read(m);
for (int i=1; i<=m; i++)
{
read(a),read(b),read(c);
if (a==1)
{
adde(b, c, 0);
adde(c, b, 0);
}
else if (a==2)
{
adde(c, b, -1);
}
else if (a==3)
{
adde(b, c, 0);
}
else if (a==4)
{
adde(b, c, -1);
}
else{
adde(c, b, 0);
}
if (a%2==0 && c==b)
{
printf("-1");
return 0;
}
}
for (int i=1; i<=n; i++)
adde(0, i, 1);
if (spfa(0))
{
for (int i=1; i<=n; i++)
{
ans += f[i];
minv = min(minv, f[i]);
}
if (minv <= 0)
ans += (-minv+1)*n;
printf("%lld", ans);
}
else
printf("-1");
return 0;
}