Codeforces 1368 E.Ski Accidents —— 想法

This way

題意:

現在有一張有向圖,邊只會從下標比較小的點指向下表比較大的點,並且每個點最多隻有2條出邊。
讓你刪掉不超過47n\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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章