题目链接:kuangbin带你飞 专题四 最短路练习 N - Tram
题意
电动巴士在每个十字路口有一个默认方向,走向别的方向需要改动扳手。
第一行给定十字路口的数量和起点终点
剩余n行给定与第i个十字路口相通的方向,第一个为默认方向
思路
典型模版题。直接dijkstra
ps:读题好费时间,英语是硬伤
代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N = 109;
const int MAX = 0x3f3f3f3f;
int dis[N];
bool vis[N];
vector<vector<pair<int, bool> > > map(N);
int dijkstra(int n, int s, int e)
{
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f3f3f3f, sizeof(dis));
dis[s] = 0;
for(int i=1; i<=n; i++)
{
int x = -1;
int max = MAX;
for(int j=1; j<=n; j++)
{
if(!vis[j] && dis[j] < max)
max = dis[x = j];
}
if(x == -1)
break;
vis[x] = 1;
vector<pair<int, bool> >::iterator begin = map[x].begin();
while(begin != map[x].end())
{
int y = (*begin).first;
int val = (*begin).second + max;
if(!vis[y] && dis[y] > val)
dis[y] = val;
++begin;
}
}
if(dis[e] == MAX)
return -1;
return dis[e];
}
int main()
{
int n,s,e;
scanf("%d%d%d", &n, &s, &e);
for(int i=1; i<=n; i++)
{
int num, t;
scanf("%d", &num);
scanf("%d", &t);
pair<int, bool> p(t, 0);
map[i].push_back(p);
for(int j=1; j<num; j++)
{
scanf("%d", &t);
pair<int, bool> p(t, 1);
map[i].push_back(p);
}
}
printf("%d\n", dijkstra(n, s, e));
return 0;
}