感觉建边写得挺对的,dij 也写得很熟,为什么爆零了,大佬求调 qwq
#include<bits/stdc++.h>
using namespace std;
int n, t, tms[55], m1, mn; // tms[i] 表示从 i 站到 i+1 站的距离
int st1[55], stn[55], pre[55], re[55]; // pre[i - 1] 表示从 1 站到 i 站的总距离
// pre[n - 1] - pre[i - 1] 表示从 i 站到 n 站的距离
// pre[i - 1] - pre[j - 1] 表示从 j 站到 i 站的总距离
long long d[55][2010];
bool vis[55][2010];
struct Edge
{
int vn, vt, w;
Edge(int vn, int vt, int w) : vn(vn), vt(vt), w(w) {}
};
struct Node
{
int un, ut;
long long d;
Node(int un, int ut, long long d) : un(un), ut(ut), d(d) {}
bool operator < (const Node &a) const
{ return d > a.d; }
};
vector<Edge> adj[55][2010]; // adj[n][t]
void dijkstra(int sn, int st)
{
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));
d[sn][st] = 0;
priority_queue<Node> q;
q.push((Node){sn, st, 0});
while (!q.empty())
{
int un = q.top().un, ut = q.top().ut;
q.pop();
if (un == n && ut == t) return;
if (vis[un][ut]) continue;
vis[un][ut] = true;
for (int i = 0; i < adj[un][ut].size(); i++)
{
int vn = adj[un][ut][i].vn, vt = adj[un][ut][i].vt, w = adj[un][ut][i].w;
if (d[vn][vt] > d[un][ut] + w)
{
d[vn][vt] = d[un][ut] + w;
q.push((Node){vn, vt, d[vn][vt]});
}
}
}
}
int main()
{
int id = 0;
while (cin >> n)
{
if (n == 0) exit(0);
id++;
cin >> t;
for (int i = 1; i < n; i++) cin >> tms[i];
memset(pre, 0, sizeof(pre));
for (int i = 1; i < n; i++) pre[i] = pre[i - 1] + tms[i];
cin >> m1;
for (int i = 1; i <= m1; i++) cin >> st1[i];
cin >> mn;
for (int i = 1; i <= mn; i++) cin >> stn[i];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= t; j++)
adj[i][j].clear();
for (int i = 1; i <= n; i++)
for (int j = 1; j < t; j++)
adj[i][j].push_back((Edge){i, j + 1, 1});
for (int i = 1; i <= m1; i++)
for (int j = 1; j < n; j++)
adj[j][pre[j - 1] + st1[i]].push_back((Edge){j + 1, pre[j] + st1[i], 0});
for (int i = 1; i <= mn; i++)
for (int j = n; j > 1; j--)
adj[j][pre[n - 1] - pre[j - 1] + stn[i]].push_back((Edge){j - 1, pre[n - 1] - pre[j - 2] + stn[i], 0});
dijkstra(1, 0);
if (d[n][t] > 1e18) printf("Case Number %d: impossible\n", id);
else printf("Case Number %d: %d\n", id, d[n][t]);
}
return 0;
}