众所周知,现在的软件基本都有开屏广告。最近小 C 发现手机里软件的广告功能又升级了,只需轻轻“摇一摇”,就会跳转到另一个软件。这让小 C 很是苦恼,哪怕他没有摇动手机,广告都会自动打开另一个软件。
现在,小 C 的手机上装有 n 个软件,其中的 m 个软件有“摇一摇”广告。具体来说,只要打开这些软件,就会弹出来“摇一摇”广告。假设第 i 个软件有“摇一摇”广告,在广告播放结束后,便会自动跳转到第 pi 个软件。接下来,如果这个软件也有“摇一摇”广告,无论先前是否打开过,它都会播放广告,并在广告结束后打开其它对应的软件;否则将会无事发生。
这些软件上疯狂的广告甚至可能停不下来。小 C 的忍耐值为 k,也就是说,当他打开一个具有“摇一摇”广告的软件,接下来连续跳转达到 k 次后,小 C 就会非常愤怒。为了能有愉快的一天,小 C 决定删除一些软件,使得他点开任何一个软件,“摇一摇”广告不会连续跳转达到 k 次。
请你告诉小 C 至少要删除几个软件。保证每个软件要么没有“摇一摇”广告,要么其“摇一摇”广告播放完后会跳转到某一个其它的软件。
第一行共三个整数 n、m 和 k,依次表示总软件数、拥有“摇一摇”广告的软件数以及小 C 的忍耐值;
接下来 m 行,每行两个整数 i 和 pi,表示第 i 个软件拥有“摇一摇”广告,在其播放完后会自动跳转到第 pi 个软件。
仅一行一个数,表示最少需要删除的软件数。
【样例1输入】
6 4 2
1 2
3 2
4 5
5 6
【样例2输入】
6 6 2
1 4
2 1
4 2
3 2
5 4
6 5
【样例1输出】
1
【样例2输出】
2
特殊性质 A:保证 m = n − 1,且“摇一摇”广告的跳转关系构成一条链,并且一定满足 pi = i + 1。
特殊性质 B:保证 m = n − 1,且存在一个正整数 x,满足当 i < x 时 pi = i + 1,当i > x 时,pi = i − 1。
特殊性质 C:保证“摇一摇”广告的跳转关系不存在环,即一定不存在从某个“摇一摇”广告开始,一直跳转下去,再次跳回到自身。
对于所有数据:1 ≤ m ≤ n ≤ 3 × 105,1 ≤ k ≤ 100,1 ≤ i, pi ≤ n。
#include<bits/stdc++.h>
using namespace std;
int n, ans,m,k;
vector<int>p[301000];
int t[301000];
int a[300100];
int vis[301000];
int tong[310000];
void dfs(int n) {
int y=vis[n];
vis[n] = 1;
for (int i = 0; i < p[n].size(); i++) {
if (vis[p[n][i]] == 0) {
dfs(p[n][i]);
}
t[n] = max(t[n],t[p[n][i]]);
}
if(y==0)t[n]++;
if (t[n] ==k+1){
t[n] = 0;
ans++;
}
return ;
}
int main() {
cin >> n>>m>>k;
for (int i = 1; i <= m; i++) {
int pp, qq;
cin >> pp >> qq;
p[qq].push_back(pp);
}
for(int i=1;i<=n;i++){
dfs(i);
//cout<<i<<" "<<t[i]<<endl;
}
///dfs(1);
cout << ans;
return 0;
}
预期50分,不会做环的部分,求助。