WA 70pts on #4 #6 #8 求调
查看原帖
WA 70pts on #4 #6 #8 求调
1046448
Polaris_flame楼主2024/10/8 16:55
#include<bits/stdc++.h>
#define FL(i,a,b) for(ll i=(a);i<=(b);i++)
#define FR(i,a,b) for(ll i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const ll MAXN = 1e6 + 10;
const ll MX = 36501;
ll dfn[MAXN],low[MAXN],idx=0;
ll s[MAXN],top=0;
ll scc[MAXN],in[MAXN],siz[MAXN],num=0;
ll f[MAXN];
bool vis[MAXN],val[MAXN];
vector<ll>G[MAXN],E[MAXN],ans;
void tarjan(ll u){
	dfn[u]=low[u]=++idx;
	vis[u]=1;
	s[++top]=u;
	for(ll v:G[u]){
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v]) low[u]=min(low[u],dfn[u]);
	} 
	if(dfn[u]==low[u]){
		scc[u]=++num;
		siz[num]=1;
		vis[u]=0;
		while(s[top]!=u){
			scc[s[top]]=num;
			siz[num]++;
			vis[s[top--]]=0;
		}
		top--;
	}
}
signed main(){
	ll n,m,mx=0;
	scanf("%lld%lld",&n,&m);
	FL(i,1,m){
		ll u,v;
		scanf("%lld%lld",&u,&v);
		G[v].push_back(u);
		//这里记得一定是建反图跑缩点+topo 
	}
	FL(i,1,n+1) if(!dfn[i]) tarjan(i);
	FL(u,1,n+1){
		for(ll v:G[u]){
			if(u==v) siz[scc[v]]++;
			else if(scc[u]!=scc[v]) E[scc[u]].push_back(scc[v]),in[scc[v]]++;
		}
	} 
	val[scc[n+1]]=1,f[scc[n+1]]=(siz[scc[n+1]]>1)?MX:1;
	queue<ll>q;
	FL(i,1,num) if(!in[i]) q.push(i);
	while(!q.empty()){
		ll u=q.front();
		q.pop();
		for(ll v:E[u]){
			in[v]--;
			if(!in[v]) q.push(v); 
			if(val[u]) val[v]=1,f[v]+=f[u];
			if(siz[v]>1&&val[v]) f[v]=MX;
			f[v]=min(f[v],MX);
		}
	}
	FL(i,1,num) if(val[i]) mx=max(mx,f[i]);
	FL(i,1,n) if(val[scc[i]]&&f[scc[i]]==mx) ans.push_back(i);
	if(mx==MX) puts("zawsze");
	else printf("%lld\n",mx);
	printf("%lld\n",ans.size());
	sort(ans.begin(),ans.end());
	for(ll x:ans) printf("%lld ",x);
}
2024/10/8 16:55
加载中...