萌新刚学 OI,WA 70 pts 求助

P3436 [POI2006] PRO-Professor Szu

```cpp #include <iostream> #include <algorithm> #include <cstdio> #include <queue> #include <cstring> #include <bitset> #include <vector> using namespace std; #define S 2000005 #define MS 1000005 #define ckjjyn 36505 int n,m; int esum,to[S],nxt[S],h[MS]; int esum2,to2[S],nxt2[S],h2[MS]; int cnt,dfn[MS],low[MS]; int top,sta[MS]; bool vis[MS]; int tot,who[MS]; vector<int> has[MS]; int ind[MS],dp[MS]; bool canto[MS]; inline void add(int x,int y) { to[++esum]=y; nxt[esum]=h[x]; h[x]=esum; } inline void add2(int x,int y) { to2[++esum2]=y; nxt2[esum2]=h2[x]; h2[x]=esum2; } void tarjan(int u) { low[u]=dfn[u]=++cnt; vis[u]=true; sta[++top]=u; for(int i=h[u];i;i=nxt[i]) { int v=to[i]; if(dfn[v]==0) { tarjan(v); low[u]=min(low[u],low[v]); } else if(vis[v]) { low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]) { tot++; while(1) { has[tot].push_back(sta[top]); who[sta[top]]=tot; vis[sta[top]]=false; if(sta[top--]==u) { break; } } } } inline void slove() { for(int i=1;i<=n+1;i++) { if(!dfn[i]) { tarjan(i); } } for(int u=1;u<=n+1;u++) { for(int i=h[u];i;i=nxt[i]) { int v=to[i]; if(who[u]!=who[v]) { add2(who[u],who[v]); ind[who[v]]++; } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); add(y,x); } slove(); dp[who[n+1]]=1; canto[who[n+1]]=true; queue<int> q; for(int i=1;i<=tot;i++) { if(ind[i]==0) { q.push(i); } } while(!q.empty()) { int u=q.front(); q.pop(); if(has[u].size()>=2) { dp[u]=ckjjyn; } for(int i=h2[u];i;i=nxt2[i]) { int v=to2[i]; dp[v]=min(dp[v]+dp[u],ckjjyn); canto[v]|=canto[u]; if(!--ind[v]) { q.push(v); } } } int ans=0; for(int i=1;i<=tot;i++) { if(canto[i]) { ans=max(ans,dp[i]); } } vector<int> v; if(ans>=ckjjyn) { puts("zawsze"); for(int i=1;i<=tot;i++) { if(dp[i]>=ckjjyn&&canto[i]) { for(int j=0;j<has[i].size();j++) { v.push_back(has[i][j]); } } } } else { printf("%d\n",ans); for(int i=1;i<=tot;i++) { if(dp[i]==ans&&canto[i]) { for(int j=0;j<has[i].size();j++) { v.push_back(has[i][j]); } } } } sort(v.begin(),v.end()); printf("%d\n",v.size()); for(int i=0;i<v.size();i++) { printf("%d ",v[i]); } printf("\n"); return 0; } ```
by lovely_ckj @ 2021-09-15 16:53:12


|