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;
}