题目链接:​​https://www.luogu.org/problemnew/show/P1346​

思路:

这是一道隐藏的最短路问题

把每一个车站看成一个点,将这个车站相连的第一个车站建立一条权为0的边,

对于它所相连的其他车站,建立边权为1的边;

所用算法:

 dijkstra

思路提示博客:

洛谷题解区第一个:​​https://www.luogu.org/problemnew/solution/P1346​

#include <iostream>
#include<vector>
#include <climits>

using namespace std;
int n, s,t;
bool mark[101];
vector<vector<int> >map[101];
int dis[101];
int maxn = INT_MAX;
vector<int>v;

void search()
{
mark[s] = 1;
dis[s] = 0;
int count = 1;
while (count<=n)
{
int loc = 0;
int min = maxn;
for (int i = 1; i <= n; i++)
{
if (!mark[i] && dis[i] < min)
{
min = dis[i];
loc = i;
}
}
if (loc == 0)break;
mark[loc] = 1;
count++;
for (int i = 1; i <= n; i++)
{
if (!mark[i])
{
for (int j = 0; j < map[loc].size(); j++)
{
if (dis[loc] + map[loc][j][1] < dis[map[loc][j][0]])
{
dis[map[loc][j][0]] = dis[loc] + map[loc][j][1];
}
}
}
}
}
if (dis[t] != maxn)cout << dis[t] << endl;
else cout << -1 << endl;

}

int main()
{
cin >> n >> s >> t;
for (int i = 1; i <= n; i++)
dis[i] = maxn;
for (int i = 1; i <= n; i++)
{
int num,a;
cin >> num;
for (int j = 0; j < num; j++)
{
cin >> a;
if (j == 0)
{
v.push_back(a);
v.push_back(0);
map[i].push_back(v);
v.clear();
if (i == s)
{
dis[map[i][j][0]] = map[i][j][1];
}
}
else
{
v.push_back(a);
v.push_back(1);
map[i].push_back(v);
v.clear();
if (i == s)
{
dis[map[i][j][0]] = map[i][j][1];
}
}
}
}
search();
return 0;
}