物流业为了降低物流成本,提高物流效率,运输过程中通常不会由始发地直达目的地,而是经由多个中转站中转,最终到达目的地。最常见的便是快递业,由于中转站有很多,要想将所有中转站两两互通代价过高,因此每个中转站只会与个别中转站单向或双向连通。
在接受订单时,为了判断该物件能否送达,会先查询本站是否能直接送达目的地站点;若不能,则递归查询本站可达中转站,以及中转站的中转站能否送达,直至找出目的地或找遍全部中转站。
小码哥去快递点实习的第一天就遇到了问题,系统因不明原因无法正常判断物件能否送达,好在整个物流网的中转站信息均可访问,小码哥便决定自己设计一个程序临时急用。
格式
输入格式:
第一行输入两个正整数 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";elsecout << "Yes";return 0;
}