用udebug的数据测试了一下应该复杂度没什么问题,求大佬看看是不是哪里死循环了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//一次bfs
ll n, m, cnt;
ll head[200005];
ll nxt[400005];
ll to[400005];
ll val[400005];
ll dp[200005];
string save[200005];
bool vis[200005];
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return x * f;
}
inline void add(ll u, ll v, ll w) {
cnt++;
nxt[cnt] = head[u];
to[cnt] = v;
val[cnt] = w;
head[u] = cnt;
}
queue<ll> q;
inline void bfs() {
q.push(n);
dp[n] = 0;
vis[n] = true;
while (!q.empty()) {
ll u = q.front();
q.pop();
vis[u] = false;
for (ll i = head[u]; i; i = nxt[i]) {
ll v = to[i];
if (dp[v] == -1 || dp[v] >= dp[u] + 1) {
dp[v] = dp[u] + 1;
if (save[v] != "")save[v] = min(save[v], to_string(val[i]) + " " + save[u]);
else
save[v] = to_string(val[i]) + " " + save[u];
if(!vis[v])vis[v]=true,q.push(v);
}
}
}
}
inline void solve() {
cout << dp[1] << endl;
if (save[1].back() == ' ')
save[1].pop_back();
cout << save[1] << endl;
}
inline void init() {
cnt = 0;
memset(vis, 0, sizeof(vis));
memset(nxt, 0, sizeof(nxt));
memset(to, 0, sizeof(to));
for (ll i = 1; i <= n; i++)
head[i] = 0, save[i] = "", dp[i] = -1;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
//ios::sync_with_stdio(0);
//cin.tie(0);
//cout.tie(0);
while (cin >> n >> m) {
init();
for (ll i = 1; i <= m; i++) {
ll u, v, w;
//cin >> u >> v >> w;
u = read();
v = read();
w = read();
add(u, v, w);
add(v, u, w);
}
bfs();
solve();
}
}