磕了一节课拓扑排序,样例还是WA ~~~~QAQ~~~~,提交的时候显示两个点RE。这时旁边的dalao建议我把N的范围调高
#define N 1000005
然后?然后我A了 ~~~~在样例还是WA的情况下~~~~
代码奉上:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 1000005
#define E 10000005
int n,num,head[N],s,ss,in[N],ti[N],f[N],ans;//s-序号 ss-前驱 in-入度 ti-花费的时间 f-最早完成时间
queue<int>q;
struct node{
int to;
int next;
}edge[N];
inline void Addedge(int u,int v)
{
edge[++num].to=v;
edge[num].next=head[u];
head[u]=num;
}
int main()
{
ios::sync_with_stdio(false);
memset(head,-1,sizeof(head));
memset(f,0,sizeof(f));
memset(in,0,sizeof(in));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s>>ti[s];
do{
cin>>ss;
if(!ss)break;
Addedge(ss,s);
in[s]++;
}while(ss);
}
for(int i=1;i<=n;i++)
if(!in[i])
{
q.push(i);
f[i]=ti[i];
}
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=head[now];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
in[to]--;
if(!in[to])q.push(to);
f[to]=max(f[to],f[now]+ti[to]);
}
}
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
cout<<ans<<'\n';
return 0;
}
洛谷的奇妙数据