原题链接:旅行计划 - 洛谷
题目描述
小明要去一个国家旅游。这个国家有 NN 个城市,编号为 11 至 NN,并且有 MM 条道路连接着,小明准备从其中一个城市出发,并只往东走到城市 ii 停止。
所以他就需要选择最先到达的城市,并制定一条路线以城市 ii 为终点,使得线路上除了第一个城市,每个城市都在路线前一个城市东面,并且满足这个前提下还希望游览的城市尽量多。
现在,你只知道每一条道路所连接的两个城市的相对位置关系,但并不知道所有城市具体的位置。现在对于所有的 ii,都需要你为小明制定一条路线,并求出以城市 ii 为终点最多能够游览多少个城市。
输入格式
第一行为两个正整数 N, MN,M。
接下来 MM 行,每行两个正整数 x, yx,y,表示了有一条连接城市 xx 与城市 yy 的道路,保证了城市 xx 在城市 yy 西面。
输出格式
NN 行,第 ii 行包含一个正整数,表示以第 ii 个城市为终点最多能游览多少个城市。
输入输出样例
输入 #1复制
5 6 1 2 1 3 2 3 2 4 3 4 2 5
输出 #1复制
1 2 3 4 3
说明/提示
均选择从城市 11 出发可以得到以上答案。
- 对于 20\%20% 的数据,1\le N ≤ 1001≤N≤100;
- 对于 60\%60% 的数据,1\le N ≤ 10001≤N≤1000;
- 对于 100\%100% 的数据,1\le N ≤ 1000001≤N≤100000,1\le M ≤ 2000001≤M≤20000000
- 代码如下:
-
#include<bits/stdc++.h> using namespace std; struct D{ int nxt,to; }d[200001]; int l[200005],w,n,m,a,b,h[200005],v[200005]; queue<int>q; void xx(int x,int y){ d[++w].nxt=h[x]; d[w].to=y; h[x]=w; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a>>b; xx(a,b); l[b]++; } for(int i=1;i<=n;i++){ if(!l[i]){ q.push(i); v[i]=1; } } while(!q.empty()){ int x1=q.front(); for(int i=h[x1];i!=0;i=d[i].nxt){ l[d[i].to]--; if(!l[d[i].to]){ v[d[i].to]=v[x1]+1; q.push(d[i].to); } } q.pop(); } for(int i=1;i<=n;i++){ printf("%d\n",v[i]); } return 0; }