为什么WA1个点,MLE3个点,呜呜呜
  • 板块P1811 最短路
  • 楼主OIer_ACMer
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/20 19:33
  • 上次更新2024/12/20 22:04:40
查看原帖
为什么WA1个点,MLE3个点,呜呜呜
415773
OIer_ACMer楼主2024/12/20 19:33
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
    int to, next;
} edge[200009];
int cnt;
int head[200009];
void add(int u, int v)
{
    edge[++cnt].to = v;
    edge[cnt].next = head[u];
    head[u] = cnt;
}
int n, m, k;
int c[3009][3009];
int mp[3009][3009][20];
int gg[3009][3009], cn[3009][3009];
int dis[3009][3009];
bool check(int a, int b, int c)
{
    for (int i = 0; i < cn[a][b]; i++)
    {
        int k = mp[a][b][i];
        if (k == c)
        {
            return 0;
        }
    }
    return 1;
}
void print(int u)
{
    vector<int> path;
    cout << dis[u][n] << endl << "1 ";
    int t1 = n, t2;
    while (t1 != 1)
    {
        path.push_back(t1);
        t2 = u;
        u = gg[u][t1];
        t1 = t2;
    }
    // reverse(path.begin(), path.end());
    for (int i = path.size() - 1; i >= 0; i--)
    {
        int v = path[i];
        cout << v << ' ';
    }
}
void bfs(int sta)
{
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            dis[i][j] = 0x3f3f3f3f;
        }
    }
    queue<pair<int, int>> q;
    q.push(make_pair(0, sta));
    dis[0][sta] = 0;
    while (!q.empty())
    {
        int x = q.front().second;
        int xx = q.front().first;
        if (x == n)
        {
            print(xx);
            exit(0);
        }
        // cout << "x=" << x << ' ' << "xx=" << xx << endl;
        q.pop();
        for (int i = head[x]; i; i = edge[i].next)
        {
            int y = edge[i].to, w = 1;
            if (dis[x][y] > dis[xx][x] + w && check(xx, x, y))
            {
                dis[x][y] = dis[xx][x] + 1;
                q.push(make_pair(x, y));
                gg[x][y] = xx;
            }
        }
    }
}
// map<map<map<int, int>, int>, int> mp;
signed main()
{
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i++)
    {
        int x, y;
        cin >> x >> y;
        add(x, y);
        add(y, x);
    }
    for (int i = 1; i <= k; i++)
    {
        int a, b, cc;
        cin >> a >> b >> cc;
        mp[a][b][++cn[a][b]] = cc;
    }
    bfs(1);
    cout << -1;
    return 0;
}
2024/12/20 19:33
加载中...