样例仅路线数错误求条
查看原帖
样例仅路线数错误求条
1038207
SolRise楼主2025/7/19 15:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,M=1e5+1;
int h[N],h1[N],cnt0,cnt,dfn[N],low[N],scc[N],p,dp[N],sz[N],num[N],f[N];
bool vis[N],zh[N];
int n,m,ans;
stack<int>st;
struct E{
	int nxt,to;
}e[M],e1[M];
void add(int u,int v)
{
	e[++cnt0]=(E){h[u],v};
	h[u]=cnt0;
}
void add1(int u,int v)
{
	e1[++cnt0]=(E){h1[u],v};
	h1[u]=cnt0;
}
void tarjan(int x)
{
	dfn[x]=low[x]=++cnt;
	st.push(x);
	vis[x]=1;
	for(int i=h[x];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(!dfn[v])
		{
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
		else if(vis[v])
			low[x]=min(low[x],dfn[v]);
	}
	if(low[x]==dfn[x])
	{
		int y;
		p++;
		do{
			y=st.top();
			scc[y]=p;
			sz[p]++;
			vis[y]=0;
			st.pop();
		}while(y!=x);
	}
}
queue<int>q1;
void topsort()
{
	queue<int>q;
	for(int i=1;i<=p;i++)
		if(!num[i])
		{
			q1.push(i);
			q.push(i);
		}
	while(!q.empty())
	{
		int f=q.front();
		q.pop();
		for(int i=h1[f];i;i=e1[i].nxt)
		{
			num[e1[i].to]--;
			if(!num[e1[i].to])
			{
				q1.push(e1[i].to);
				q.push(e1[i].to);
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		if(u!=v)
			add(u,v);
		else
			zh[u]=1;
	}
	for(int i=1;i<=n+1;i++)
		if(!dfn[i])
			tarjan(i);
	cnt0=0;
	for(int i=1;i<=n+1;i++)
		for(int j=h[i];j;j=e[j].nxt)
		{
			int v=e[j].to;
			if(scc[i]!=scc[v])
			{
				add1(scc[v],scc[i]);
				num[scc[i]]++;
			}
		}
	topsort();
	dp[scc[n+1]]=1;
	while(!q1.empty())
	{
		int f=q1.front();
		q1.pop();
		for(int j=h1[f];j;j=e1[j].nxt)
		{
			int v=e[j].to;
			dp[v]=min(36501ll,dp[v]+dp[f]);
		}
	}
	for(int i=1;i<=n+1;i++)
	{
		f[i]=dp[scc[i]];
		ans=max(ans,f[i]);
	}
	cout<<ans<<"\n";
	queue<int>q2;
	for(int i=1;i<=n;i++)
		if(f[i]==ans)
			q2.push(i);
	cout<<q2.size()<<"\n";
	while(!q2.empty())
	{
		cout<<q2.front()<<" ";
		q2.pop();
	}
	return 0;
}

代码输出

2
1
1

样例答案

4
1
1

求条

2025/7/19 15:24
加载中...