SPFA代码TLE求助
  • 板块CF229B Planets
  • 楼主lxy_qwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/5 20:08
  • 上次更新2024/12/5 23:00:54
查看原帖
SPFA代码TLE求助
1050426
lxy_qwq楼主2024/12/5 20:08

VJ上交的,写的SPFA,超时了

Time limit exceeded on test 7

2000ms

//spfa
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3,"Ofast","inline")
int n, m;
int u, v, w;
const int MAXN = 1e5 + 5;
struct Node{
    int to, next, w;
}e[MAXN];
int head[MAXN];
int dist[MAXN];
vector<int> t[MAXN];
int cnt;
void init()
{
    for(register int i = 0 ;i < MAXN; i++)
    {
        head[i] = -1;
        dist[i] = 34546332;
    }
    dist[1] = 0;
}
void add(int x, int y, int w)
{
    e[cnt].next = head[x];
    e[cnt].to = y;
    e[cnt].w = w;
    head[x] = cnt++;
}
bool spfa(int x, int y)
{
    //x -> y
    queue<int> q;
    q.push(x);
    while(!q.empty())
    {
        int sz = q.size();
        while(sz--)
        {
            int now = q.front();
            q.pop();
            for(register int i = head[now]; ~i; i = e[i].next)
            {
                int v = e[i].to;//到达的点
                int num = dist[now] + e[i].w;//花费
                for(int i = 0; i < t[now].size(); i++)
                {
                    //查看
                    if(t[now][i] > dist[now])
                    {
                        //传送需要等待
                        break;//不需要
                    }
                    if(t[now][i] == dist[now])
                    {
                        //需要
                        //cout << now << "-" << v << endl;
                        num++;
                        for(register int j = i + 1; j < t[now].size(); j++)
                        {
                            if(t[now][j] == t[now][j - 1] + 1)
                            {
                                num++;
                            }
                        }
                    }
                }
                //cout << now << "->" << v << " "<< num << endl;
                //cout << dist[v] << endl;
                if(num < dist[v])
                {
                    dist[v] = num;
                    //cout << now << "->" << v << " = " << dist[v] << endl;
                    if(v != n)q.push(v);
                }

            }
        }
    }
    return true;
}
int main()
{
    std::ios::sync_with_stdio(false);
// 解除cin与cout的绑定
std::cin.tie(nullptr);
std::cout.tie(nullptr);
    init();
    cin >> n >> m;
    while(m--)
    {
        int x, y, w;
        cin >> x >> y >> w;
        add(x, y, w);
        add(y, x, w);
    }
    for(register int i = 1; i <= n; i++)
    {
        int x;cin >> x;
        for(register int j = 1; j <= x; j++)
        {
            int z;cin >> z;
            t[i].push_back(z);
        }
    }
    spfa(1, n);
    if(dist[n] != 34546332)cout << dist[n];
    else cout << -1;
    return 0;
}
2024/12/5 20:08
加载中...