求调
查看原帖
求调
548203
KK_lang楼主2023/3/14 18:15

感觉建边写得挺对的,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;
}
2023/3/14 18:15
加载中...