Think:
1知识点:最短路_spfa()算法
2思考:理解题意进而建图
以下为Accepted代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e2 + 4;
int n, e[N][N], vis[N], dis[N];
void spfa(int x);
int main(){
int x, y, k, i, j, v;
while(~scanf("%d %d %d", &n, &x, &y)){
memset(e, inf, sizeof(e));
for(i = 1; i <= n; i++){
scanf("%d", &k);
for(j = 0; j < k; j++){
scanf("%d", &v);
if(!j)
e[i][v] = 0;
else
e[i][v] = 1;
}
}
spfa(x);
if(dis[y] != inf)
printf("%d\n", dis[y]);
else
printf("-1\n");
}
return 0;
}
void spfa(int x){
queue <int> q;
while(!q.empty()){
q.pop();
}
memset(dis, inf, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[x] = 0, vis[x] = 1;
q.push(x);
while(!q.empty()){
int t1 = q.front();
q.pop();
vis[t1] = 0;
for(int i = 1; i <= n; i++){
if(dis[t1] + e[t1][i] < dis[i]){
dis[i] = dis[t1] + e[t1][i];
if(!vis[i]){
vis[i] = 1;
q.push(i);
}
}
}
}
}