题目P1983.样例过.MLE.但是空间不大。求助
  • 板块学术版
  • 楼主lmrttx
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/10/12 10:22
  • 上次更新2023/11/5 10:57:10
查看原帖
题目P1983.样例过.MLE.但是空间不大。求助
344382
lmrttx楼主2020/10/12 10:22

做法:拓扑。c++

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int s=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*w;
}
#define RI /*register*/ int
#define pii pair<int,int>
const int E=1005;
int s[E][E],n,m,ans,in[E],vis[E],tot,pd[E][E];
queue<pii>q;
vector<int>g[E];
int out(int kkk)
{
	if(kkk>9)out(kkk/10);
	putchar(kkk%10+'0');
}
void bfs()
{
	RI i;
	for(i=1;i<=n;i++)
	if(in[i]==0)q.push(make_pair(i,1));
	ans=1;
	while(!q.empty())
	{
		int u=q.front().first,val=q.front().second;
		q.pop();
		for(i=0;i<g[u].size();i++)
		{
			int v=g[u][i];
			in[v]--;
			if(in[v]==0)
			{
				q.push(make_pair(v,val+1));
				ans=max(ans,val+1);
			}
		}
	}
}
int main()
{
	RI i,j;
	n=read();m=read();
	for(i=1;i<=m;i++)
	{
		s[i][0]=read();
		memset(vis,-1,sizeof(vis));
		for(j=1;j<=s[i][0];j++)
		{
			s[i][j]=read();
			vis[s[i][j]]=1;
		}
		for(j=s[i][1];j<=s[i][s[i][0]];j++)
		{
			if(vis[j]==1)continue;
			for(RI k=1;k<=s[i][0];k++)
			if(pd[j][s[i][k]]==0)
			{
				in[s[i][k]]++;
				g[j].push_back(s[i][k]);
				pd[j][s[i][k]]=1;
			}
		}
	}
	bfs();
	out(ans);
	return 0;
 } 
2020/10/12 10:22
加载中...