Description
Input
Output
Sample Input
4 4
1 2 3 4
Sample Output
4
HINT
Source
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
const int N = 1005;
int dfn[N],low[N],Stack[N],flag[N],vist[N],num[N],top,deep,tn;
vector<int>mapt1[N],mapt2[N];
void init(int n)
{
for(int i=1;i<=n;i++)
{
mapt1[i].clear();
mapt2[i].clear();
dfn[i]=0;
num[i]=0;
vist[i]=0;
}
tn=top=deep=0;
}
int tt;
void tarjan(int u)
{
vist[u]=tt;
deep++;
dfn[u]=low[u]=deep;
Stack[++top]=u;
int len=mapt1[u].size();
for(int i=0;i<len;i++)
{
int v=mapt1[u][i];
if(vist[v]==0)
{
tarjan(v);
if(low[u]>low[v])
low[u]=low[v];
}
else if(vist[v]==tt&&low[u]>dfn[v])//注意vist[v]==tt
low[u]=dfn[v];
}
if(low[u]==dfn[u])
{
tn++;
while(u!=Stack[top])
{
flag[Stack[top]]=tn; num[tn]++;top--; //printf("%d ",Stack[top]);
}
flag[Stack[top]]=tn; num[tn]++; top--;
}
}
int in[N],have[N][N];
void rebuilMap(int n)//用强连通缩点,重新反向建图
{
tt=0;
for(int i=1;i<=n;i++)
if(vist[i]==0)
{
tt++;
tarjan(i);
}
memset(in,0,sizeof(in));
memset(have,0,sizeof(have));
//缩点后的图无 有向环
for(int i=1;i<=n;i++)
{
int u=flag[i];
for(int j=0;j<mapt1[i].size();j++)
{
int v=flag[mapt1[i][j]];
if(u==v||have[v][u])
continue;
in[u]++; have[v][u]=1;
mapt2[v].push_back(u);//反向建图,只有v里的人去旅游,u里的人才会去
}
}
}
int k;
int tope()
{
int dp[N],a[N],m=0;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=tn;i++)
if(in[i]==0&&num[i]<=k)//入度为0,且点内的人数小于等于车的坐位数
{
a[m++]=i;
for(int j=k;j>=num[i];j--)
if(dp[j-num[i]]==1)
dp[j]=1;
}
while(m--)
{
int u=a[m];
for(int i=0;i<mapt2[u].size();i++)
{
int v=mapt2[u][i];
in[v]--;
if(in[v]==0&&num[v]<=k)
{
a[m++]=v;
for(int j=k;j>=num[v];j--)
if(dp[j-num[v]]==1)
dp[j]=1;
}
}
}
for(int i=k;i>=0;i--)
if(dp[i])
return i;
return 0;
}
int main()
{
int n;
scanf("%d%d",&n,&k);
{
init(n);
for(int i=1;i<=n;i++)
{
int j;
scanf("%d",&j);
mapt1[i].push_back(j);
}
rebuilMap(n);
printf("%d\n",tope());
}
return 0;
}
/*
12 3
2 3 4 5 6 7 4 7 8 8 12 12
2
*/
/**************************************************************
Problem: 1580
User: aking2015
Language: C++
Result: Accepted
Time:8 ms
Memory:5064 kb
****************************************************************/