// 这题坑爹啊 , 米有看清这已经是topsort() 的了, 害我浪费20多分钟写了那么长还爆内存....
Source Code
Problem: 1949 User: eth1
Memory: 292K Time: 1500MS
Language: C++ Result: Accepted
Source Code
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
//bool vis[10001][10001];
int time[10001],n;//max_time[10001],d[10001];
int main()
{
int m,a;
cin>>n;
// memset(vis,0,sizeof(vis));
// memset(max_time,0,sizeof(max_time));
// memset(d,0,sizeof(d));
cin>>time[1]>>m;
for(int i=2;i<=n;i++)
{
cin>>time[i]>>m;
int tem=0;
while(m--)
{
cin>>a;
tem=max(tem,time[a]);
}
time[i]+=tem;
}
sort(time+1,time+1+n);
cout<<time[n]<<endl;
//topsort();
return 0;
}
/////// 米有排序好的...
void topsort()
{
int k=-1;
for(int i=1;i<=n;i++)
{
if(!d[i])
{
d[i]=k;
k=i;
}
}
int maxx=0;
for(int j=1;j<=n;j++)
{
int tem=k; k=d[k];
max_time[tem] += time[tem];
maxx = max(maxx,max_time[k]);
for(int i=1;i<=n;i++)
{
if(vis[tem][i])
{
max_time[i]=max(max_time[i],max_time[tem]);
if( (--d[i])==0 )
{
d[i]=k;
k=i;
}
}
}
}
sort(max_time+1,max_time+n+1);
//for(int i=1;i<=n;i++)
//cout<<max_time[i]<<endl;
cout<<max_time[n]<<endl;
}
int main()
{
int m,a;
cin>>n;
memset(vis,0,sizeof(vis));
memset(max_time,0,sizeof(max_time));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
{
cin>>time[i]>>m;
while(m--)
{
cin>>a;
vis[a][i]=1;
d[i]++;
}
}
topsort();
return 0;
}