物流业为了降低物流成本,提高物流效率,运输过程中通常不会由始发地直达目的地,而是经由多个中转站中转,最终到达目的地。最常见的便是快递业,由于中转站有很多,要想将所有中转站两两互通代价过高,因此每个中转站只会与个别中转站单向或双向连通。
在接受订单时,为了判断该物件能否送达,会先查询本站是否能直接送达目的地站点;若不能,则递归查询本站可达中转站,以及中转站的中转站能否送达,直至找出目的地或找遍全部中转站。
小码哥去快递点实习的第一天就遇到了问题,系统因不明原因无法正常判断物件能否送达,好在整个物流网的中转站信息均可访问,小码哥便决定自己设计一个程序临时急用。
格式
输入格式:
第一行输入两个正整数 n,m,n 是整个物流网所有中转站的数目,小码哥所在的站点是 1 号,目的地的站点是 n 号;
接下来的 m 行,每行输入两个正整数 x,y,代表中转站 x 可以送往中转站 y。
输出格式:
如果物件能够送达,输出”Yes”,否则输出”No”。
样例 1
输入:
5 5
1 3
2 3
3 4
2 4
4 5
输出:
Yes
样例 2
输入:
4 3
1 2
2 3
4 1
输出:
No
备注
其中:1<n≤500,1<m≤20000,1≤x,y≤n
代码:(这里注意要用图存储)(可以直接用模板)
模板:https://blog.csdn.net/l141930402/article/details/136769575?spm=1001.2014.3001.5501
#include <bits/stdc++.h> using namespace std; const int N = 100010; int n, m; int h[N], e[N], ne[N]; int idx = 0; bool st[N]; void add(int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx; idx++; } void dfs(int x) { st[x] = true; for (int i = h[x]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j); } return; } int main() { cin >> n >> m; memset(h,-1,sizeof h); while (m--) { int x, y; cin >> x >> y; add(x, y); } dfs(1); if (!st[n]) cout << "No"; else cout << "Yes"; return 0; }