Codeforces 1368 E.Ski Accidents —— 想法

This way

题意:

现在有一张有向图,边只会从下标比较小的点指向下表比较大的点,并且每个点最多只有2条出边。
让你删掉不超过 4 7 n \frac{4}{7}n 个点,使得里面没有一条长度超过1的路径。

题解:

为什么是4/7,是因为,在一棵满二叉树中,删掉最下面一行,占比是4/7
在这里插入图片描述
那么我们只需要从小到大枚举每个点,然后枚举每个儿子,让儿子的深度与它的深度+1模3取一个最大值,如果某个数的深度是2,那么就要删除。当然会出现这种情况:
在这里插入图片描述
这种时候是不是删掉了4个值,当然不是,
在这里插入图片描述
此时3的深度为2,然后接下来的点又重新开始,所以删掉的绝对要更少。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
vector<int>vec[N];
int dep[N];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            vec[i].clear(),dep[i]=0;
        int x,y;
        for(int i=1;i<=m;i++)
            scanf("%d%d",&x,&y),vec[x].push_back(y);
        for(int i=1;i<=n;i++)
            for(int j:vec[i])
                dep[j]=max(dep[j],(dep[i]+1)%3);
        int ans=0;
        for(int i=1;i<=n;i++)
            if(dep[i]==2)
                ans++;
        printf("%d\n",ans);
        for(int i=1;i<=n;i++)
            if(dep[i]==2)
                printf("%d ",i);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/107091794
今日推荐