以下代码,无法通过样例2,但提交100分。
#include <iostream>
#include <cstring>
#include <queue>
#define int unsigned long long
using namespace std;
const int N = 514514;
struct node
{
int to,w,nxt;
}edge[N];
int head[N];
int cnt = 1;
void add(int u,int v,int w)
{
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
cnt ++;
}
int n,m;
int d[N];
int flag[N];
int h,x,y,z;
void init()
{
for (int i = 0 ; i <= x + 5; i ++)
{
d[i] = (1ull << 63) - 1;
}
}
void spfa(int p)
{
init();
memset(flag,0,sizeof(int) * (x + 5));
queue<int> q;
d[p] = 0;
q.push(p);
//ccnt[p] ++;
flag[p] = true;
while (!q.empty())
{
int u = q.front();
q.pop();
flag[u] = false;
for (int i = head[u] ; i != 0 ; i = edge[i].nxt)
{
int v = edge[i].to;
int w = edge[i].w;
//std :: cout << u << " " << w << " " << v << "\n";
if (d[v] > d[u] + w)
{
//std :: cout << v;
d[v] = d[u] + w;
if (!flag[v])
{
flag[v] = true;
q.push(v);
// ccnt[v] ++;
// if (ccnt[v] > n)
// {
// return true;
// }
}
}
}
}
}
signed main()
{
std :: cin >> h >> x >> y >> z;
if (x == 1 || y == 1 || z == 1)
{
std :: cout << h << "\n";
return 0;
}
h --;
//int t = std :: min(min(x,y),z);
for (int i = 0 ; i < x ; i ++)
{
add(i,(i + y) % x,y);
add(i,(i + z) % x,z);
//printf("(%d+%d)mod%d=%d\n",i,y,x,(i + y) % x);
//printf("(%d+%d)mod%d=%d\n",i,z,x,(i + z) % x);
}
spfa(0);
long long ans = 0;
//for (int i = 0 ; i < x ; i ++) std :: cout << d[i] << " ";
for (int i = 0 ; i < x ; i ++)
{
if (d[i] <= h)
{
ans += (h - d[i]) / x + 1;
//ans +=(h -dis[i])/x +1;
}
//ans += ((unsigned long long)(h - i) / (unsigned long long)(x + 1)) - ((unsigned long long)(d[i] - i) / (unsigned long long)(x + 1));
}
std :: cout << ans;
}
求大佬答疑解惑