洛谷 P1346 电车 dijkstra
原创
©著作权归作者所有:来自51CTO博客作者hitns的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接: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;
}