这题有点巧妙,如果路口开始不是指向自己,那么权重就是1,否则是0,且我在写的时候显示超出内存了,这时候我们的进栈条件就要约束一下,只有比我们当前记录的dis小的才能进栈
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int e[N*N*2],ne[N*N*2],h[N],idx = 0;
int w[N*N*2];
int n,a,b;
int vis[N];
int dis[N];
void add(int a,int b,int wei){
e[++idx] = b , ne[idx] = h[a], h[a] = idx;
w[idx] = wei;
}
int diss(){
for(int i=1;i<=n;i++){
dis[i] = 0x3fffffff;
}
priority_queue<pair<int,int>> q;
q.push({0,a});
dis[a] = 0;
while(q.size()){
int d = -q.top().first, u = q.top().second;
q.pop();
if(u==b) return d;
if(vis[u]) continue;
vis[u];
for(int i=h[u];i;i=ne[i]){
int to = e[i] , wei = w[i];
if(vis[to]) continue;
if(d+wei<dis[to]){
dis[to] = d+wei;
q.push({-(dis[to]),to});
}
}
}
return -1;
}
int main(){
cin >> n >> a >> b;
for(int i=1;i<=n;i++){
int k;
cin >> k;
for(int j=1;j<=k;j++){
int u; cin >> u;
if(j==1) add(i,u,0);
else add(i,u,1); // 十分妙的建图
}
}
int d = diss();
cout << d;
return 0;
}