TLE三个怎么办,求解
查看原帖
TLE三个怎么办,求解
1314201
LeleZeng楼主2024/8/28 00:01

用数组建立链式前向星真的跟用vector建立,差别很大吗

用vector建就会TLE三个。。。
后面附上代码:

//P4568 [JLOI2011] 飞行路线
//无向有环图
//dijkstra算法模板 + dp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e4 + 10;
int dp[N][11];
// int vis[N];dijkstra不需要记忆化数组
struct node
{
    int p;
    int cost;
    node (int p, int cost) : p(p), cost(cost){}
    bool operator<(node a) const
    {
        return cost < a.cost;
    }
};

//建立链式前向星
struct edge
{
    int to;
    int cost;
};
vector<int> g[N];
vector<edge> e;
int n, m, k, s, f;
priority_queue<node> q;
int main()
{
    // std::ios::sync_with_stdio(0);
    // cin.tie(NULL);
    cin >> n >> m >> k >> s >> f;
    for (int i = 0, a, b, c; i < m; i++)
    {
        scanf("%d%d%d", &a, &b, &c);
        e.push_back({b, c});
        g[a].push_back(e.size() - 1);
        e.push_back({a, c});
        g[b].push_back(e.size() - 1);
    }
    // memset(dp, 0x3f, sizeof dp);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <= k; j++)
            dp[i][j] = 1e9;
    }
    for (int i = 0; i <= k; i++) dp[s][i] = 0;
    for (int t = 0; t <= k; t++)
    {
        q.push(node(s, 0));
        while (!q.empty())
        {
            node cnt = q.top();
            int u = cnt.p;
            q.pop();
            if (cnt.cost > dp[u][t]) continue;//为了排除前一次更新的点,保证只处理最新的点,即到达当前点所花费路程最少的情况
            for (int i = 0; i < g[u].size(); i++)
            {
                int v = e[g[u][i]].to, w = e[g[u][i]].cost;
                bool flag = 0;
                if (t && dp[u][t - 1] < dp[v][t])
                {
                    dp[v][t] = dp[u][t - 1];
                    flag = 1;
                }
                if (dp[u][t] + w < dp[v][t])
                {
                    dp[v][t] = dp[u][t] + w;
                    flag = 1;
                }
                if (flag)
                {
                    q.push(node(v, dp[v][t]));
                }
            }
            
        }
    }
    
    
    cout << dp[f][k] << endl;
    return 0;
}
2024/8/28 00:01
加载中...