链接:https://ac.nowcoder.com/acm/problem/209820
来源:牛客网
题目描述
牛牛擅长投影剑类来战斗,他投影的武器甚至有着核弹般的破坏力,故人送外号核弹剑仙。
现在牛牛投影了nnn把武器,编号为1∼n1\sim n1∼n,每把武器都有一个属于自己的破坏力,且任意两把武器之间的破坏力不同。他接下来进行了mmm次比较,每次比较会告诉你aaa武器破坏力强于bbb武器破坏力,数据保证比较结果不会自相矛盾。
请问你能根据这mmm次比较结果,告诉牛牛:对于iii号武器,明确比iii号武器破坏力大的武器有多少把吗?
输入描述:
第一行两个正整数nnn,mmm,n≤103n\leq10{3}n≤103,m≤2×103m\leq2\times10{3}m≤2×103。
接下来mmm行,每行两个正整数aaa,bbb,其中a≤na\leq na≤n,b≤nb\leq nb≤n。
输出描述:
输出nnn行,第iii行的数字表示明确比iii号武器破坏力大的武器有多少把。
示例1
输入
复制
6 5
1 3
2 4
3 5
4 5
5 6
输出
复制
0
0
1
1
4
5
- 反向建图,枚举每个点为
根
开始dfs
即可,注意去除重复点, - 如图,有重复访问的点
bool vis[MAXN];
int dfs(int u) {
int chls = 1;
vis[u] = true;
for(auto v : G[u])
if(!vis[v]) chls += dfs(v);
return chls;
}
read(n, m);
int u, v;
for(int i=1; i<=m; i++) {
read(v, u); //反向建边
G[u].push_back(v);
ind[v] ++;
}
for(int i=1; i<=n; i++) {
memset(vis, false, sizeof(vis));
printf("%d\n", dfs(i)-1);
// if(!ind[i]) { dfs(i); }
}