題意:
現在有一張有向圖,邊只會從下標比較小的點指向下表比較大的點,並且每個點最多隻有2條出邊。
讓你刪掉不超過個點,使得裏面沒有一條長度超過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;
}