题目描述
小Biu所在的城市有n个景点,有一些景点之间有单向联通的道路,现在小Biu在1号景点上,他想知道到达除了1号景点之外的每个景点分别最少需要经过多少条道路?
如图所示为样例数据,可以知道小Biu到达2号景点的最短路线为1->2,到达3号景点的最短路线为1->3,到达4号景点的最短路线为1->2->4,到达5号景点的最短路线为1->3->5,到达6号景点的最短路线为1->3->5->6。所以答案分别为1,1,2,2,3。
输入
第1行两个正整数n,m,n表示景点的个数,n表示路径的条数。
第2行至第m-1行,每行两个u,v,表示u到v有一条单向联通的道路,数据保证没有重边和自环。输出
输出n-1行,第i行表示从1号景点到达i+1号景点最少要经过几条道路,如果不能到达则输出-1。
样例输入 Copy
6 6 1 2 1 3 2 4 3 2 3 5 5 6样例输出 Copy
1 1 2 2 3提示
对于100%的数据,1≤u,v≤n≤1000,1≤m≤3000。
对权值为一的图求最短路用dfs
代码
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m;
int g[1010][1010],dist[1010];
void dfs()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
queue<int> q;
q.push(1);
while(q.size())
{
int t=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(dist[i]==0x3f3f3f3f&&g[t][i])
{
dist[i]=dist[t]+1;
q.push(i);
}
}
}
int main()
{
cin>>n>>m;
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=1;
}
dfs();
for(int i=2;i<=n;i++)
if(dist[i]!=0x3f3f3f3f) printf("%d\n",dist[i]);
else printf("-1\n");
return 0;
}