题意:
有N个站点,站点之间有轨道相连,但是站点同时只连向一个站点,要到该站点可以到的其它站点需要使用转换器,问从A到B需要最少使用多少次转换器
思路:
初始时的路径权值初始化为0,备用的权值为1,跑最短路即可。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 100+5;
using namespace std;
int n,m;
int head[maxn], cur;
struct Edge{
int v,w,next;
};
Edge edges[100000];
void init(int a){
for(int i = 0; i <= a; ++i) head[i] = -1;
cur = 0;
}
void addEdge(int u, int v, int w){
edges[cur].v = v; edges[cur].w = w;
edges[cur].next = head[u]; head[u] = cur++;
}
struct Node{
int u,d;
Node(int a, int b):u(a),d(b){}
bool operator < (const Node& rhs) const{
return d > rhs.d;
}
};
int d[maxn];
bool vis[maxn];
int Dijkstra(int s, int t){
for(int i = 1; i <= n; ++i) { d[i] = INF; vis[i] = 0; }
d[s] = 0;
priority_queue<Node> Q;
Q.push(Node(s, 0));
while(!Q.empty()){
Node t = Q.top(); Q.pop();
int u = t.u;
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; i != -1; i = edges[i].next){
int v = edges[i].v, w = edges[i].w;
if(d[v] > d[u] + w){
d[v] = d[u] + w;
Q.push(Node(v, d[v]));
}
}
}
return d[t];
}
int main()
{
//freopen("in.txt","r",stdin);
int s,t;
while(scanf("%d%d%d",&n,&s,&t) == 3){
init(n);
for(int i = 1; i <= n; ++i){
int x,b; scanf("%d",&x);
for(int j = 0; j < x; ++j){
scanf("%d",&b);
if(j == 0) addEdge(i, b, 0);
else addEdge(i, b, 1);
}
}
int ans = Dijkstra(s, t);
if(ans == INF) printf("-1\n");
else printf("%d\n", ans);
}
fclose(stdin);
return 0;
}