关于此题跑最短路的疑问
查看原帖
关于此题跑最短路的疑问
327139
纯白楼主2021/11/16 23:08

说一下我的想法
因为对于一组不等式xixikix_i - x_i \leq k_i
它的一组解{x1,x2...xn}\{x_1,x_2...x_n\}全都加上nn后又是令一组解,因此我们求得所有的最短路,再整体加上一个数,使得加完后最小的数大于等于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;
	
}
2021/11/16 23:08
加载中...