题面
对于给定的有向图 G = (V, E),编写一个程序来找出从顶点 1 到每个顶点的最短距离 d(路径上的最小边数)。每个顶点从 1 到 n 编号。 对于不能从顶点 1 到达的顶点,输出 -1。
输入
第一行给出了 G 中的顶点数 n。 接下来的 n 行给出了每个顶点 u 的邻接表,格式如下:
ukv1v2…vk
u 是顶点的编号,k 是 u 的度数,v1v2…vk是与 u 相邻的顶点的编号。
约束
1≤n≤100
输出
在一行上输出每个顶点的 id 和 d。 id 是顶点的编号,d 是顶点 1 到该顶点的距离。 按顶点编号顺序输出。
输入样例
4 1 2 2 4 2 1 4 3 0 4 1 3
输出样例
1 0 2 1 3 2 4 1
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 109
using namespace std;
int f[maxn];
vector<int> son[maxn];
bool vis[maxn];
int d[maxn];
void bfs(){
queue<int> q;
vis[1]=1;
q.push(1);
d[1]=0;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=0;i<son[now].size();i++){
int x=son[now][i];
if(!vis[x]){
vis[x]=1;
d[x]=d[now]+1;
q.push(x);
}
}
}
}
int main(){
memset(d,-1,sizeof(d));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int id;
scanf("%d",&id);
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++){
int vi;
scanf("%d",&vi);
son[id].push_back(vi);
}
}
bfs();
for(int i=1;i<=n;i++){
printf("%d %d\n",i,d[i]);
}
}