自己交五发没过,愤怒抄题解,结果题解也没过。(?)
现请求撤下题解,并求条。悬关。
这是我的代码:60pts提交记录
#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
int n,m,dfn[N],low[N],vis[N],cnt=0,scc[N],siz[N],in[N],dp[N],inf=36501,sc=0;
vector<int>e[N],e2[N],ans[N];
stack<int>st;
void tarjan(int f,int x)
{
dfn[x]=low[x]=++cnt;vis[x]=1;st.push(x);
for(int i=0;i<e[x].size();i++)
{
int d=e[x][i];
if(d==f)continue;
if(!dfn[d])
{
tarjan(x,d);
low[x]=min(low[x],low[d]);
}
else if(vis[d])low[x]=min(low[x],dfn[d]);
}
if(dfn[x]==low[x])
{
sc++;scc[x]=x;vis[x]=0;ans[x].push_back(x);
while(st.top()!=x)
{
int d=st.top();
scc[d]=x;
siz[x]++;
vis[d]=0;
ans[x].push_back(d);
st.pop();
}
st.pop();siz[x]++;
if(siz[x]==1)
{
for(int i=0;i<e[x].size();i++)
{
if(e[x][i]==x)siz[x]++;
}
}
}
}
void topo()
{
queue<int>q;q.push(scc[n+1]);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=0;i<e2[x].size();i++)
{
int d=e2[x][i];
dp[d]=min(dp[d]+dp[x]+(siz[d]>1?inf:0),inf);
if(--in[d]==0)q.push(d);
//cout<<d<<' '<<dp[d]<<' '<<x<<' '<<dp[x]<<'\n';
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;cin>>x>>y;
e[x].push_back(y);
}
for(int i=1;i<=n+1;i++)if(!dfn[i])tarjan(0,i);
for(int i=1;i<=n+1;i++)
{
int x=scc[i];
for(int j=0;j<e[i].size();j++)
{
int y=scc[e[i][j]];
if(x!=y)e2[y].push_back(x),in[x]++;
}
}
for(int i=1;i<=n+1;i++)
{
int x=scc[i];
for(int j=0;j<e[i].size();j++)
{
int y=scc[e[i][j]];
if(x!=y&&in[y]==0&&y!=scc[n+1])in[x]--;
}
}
dp[scc[n+1]]=(siz[scc[n+1]]>1?inf:1);
topo();
int maxi=0;
for(int i=1;i<=n;i++)maxi=max(maxi,dp[i]);
if(maxi<inf)cout<<maxi<<'\n';
else cout<<"zawsze\n";
int ans1=0;
for(int i=1;i<=n+1;i++)
{
if(dp[i]==maxi)
{
for(int j=0;j<ans[i].size();j++)if(ans[i][j]!=n+1)vis[++ans1]=ans[i][j];
}
}
cout<<ans1<<'\n';
sort(vis+1,vis+ans1+1);
for(int i=1;i<=ans1;i++)cout<<vis[i]<<' ';
return 0;
}