描述
题解
和今年天梯赛 L3-2 题面很像,但是更加简单一些。这个题只是一个单纯的最短路,不过我们需要先对路线进行一个比较特殊的建图处理,比如说, 4 7 3 6 ,我们应该在 4 7 、 4 3 、 4 6 、 7 3 、 7 6 、 3 6 之间都连一条线,权值为 1 的线,然后求最短路即可。
代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 505;
const int INF = 0x3f3f3f3f;
vector<int> vi[MAXN];
int d[MAXN], vis[MAXN], a[MAXN];
char s[100 * MAXN];
void spfa(int s)
{
queue<int> q;
q.push(s);
vis[s] = 1;
d[s] = -1;
while (!q.empty())
{
int u = q.front();
vis[u] = 0;
q.pop();
for (int i = 0; i < vi[u].size(); i++)
{
int v = vi[u][i];
if (d[v] > d[u] + 1)
{
d[v] = d[u] + 1;
if (!vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
}
int main()
{
int T;
cin >> T;
int n, m;
while (T--)
{
memset(vis, 0, sizeof(vis));
cin >> m >> n;
getchar();
for (int i = 1; i <= n; i++)
{
d[i] = INF;
vi[i].clear();
}
for (int i = 0; i < m; i++)
{
fgets(s, 100 * MAXN, stdin);
int len = (int)strlen(s);
len--;
int cnt = 0;
for (int i = 0; i < len; i++)
{
while (s[i] == ' ')
{
i++;
}
int num = 0;
while (s[i] >= '0' && s[i] <= '9')
{
num *= 10;
num += s[i] - '0';
i++;
}
a[cnt++] = num;
}
for (int j = 0; j < cnt; j++)
{
for (int k = j + 1; k < cnt; k++)
{
vi[a[j]].push_back(a[k]);
}
}
}
spfa(1);
if (d[n] == INF)
{
cout << "NO" << endl;
}
else
{
cout << d[n] << endl;
}
}
return 0;
}