市赛题目求大佬帮忙
  • 板块题目总版
  • 楼主bb3653
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/6 10:26
  • 上次更新2024/10/6 10:48:43
查看原帖
市赛题目求大佬帮忙
976845
bb3653楼主2024/10/6 10:26

题目描述 Description

众所周知,现在的软件基本都有开屏广告。最近小 C 发现手机里软件的广告功能又升级了,只需轻轻“摇一摇”,就会跳转到另一个软件。这让小 C 很是苦恼,哪怕他没有摇动手机,广告都会自动打开另一个软件。

现在,小 C 的手机上装有 n 个软件,其中的 m 个软件有“摇一摇”广告。具体来说,只要打开这些软件,就会弹出来“摇一摇”广告。假设第 i 个软件有“摇一摇”广告,在广告播放结束后,便会自动跳转到第 pi 个软件。接下来,如果这个软件也有“摇一摇”广告,无论先前是否打开过,它都会播放广告,并在广告结束后打开其它对应的软件;否则将会无事发生。

这些软件上疯狂的广告甚至可能停不下来。小 C 的忍耐值为 k,也就是说,当他打开一个具有“摇一摇”广告的软件,接下来连续跳转达到 k 次后,小 C 就会非常愤怒。为了能有愉快的一天,小 C 决定删除一些软件,使得他点开任何一个软件,“摇一摇”广告不会连续跳转达到 k 次。

请你告诉小 C 至少要删除几个软件。保证每个软件要么没有“摇一摇”广告,要么其“摇一摇”广告播放完后会跳转到某一个其它的软件。

输入描述 Input Description

第一行共三个整数 n、m 和 k,依次表示总软件数、拥有“摇一摇”广告的软件数以及小 C 的忍耐值;
接下来 m 行,每行两个整数 i 和 pi,表示第 i 个软件拥有“摇一摇”广告,在其播放完后会自动跳转到第 pi 个软件。

输出描述 Output Description

仅一行一个数,表示最少需要删除的软件数。

样例输入 Sample Input

【样例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

样例输出 Sample Output

【样例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分,不会做环的部分,求助。

2024/10/6 10:26
加载中...