思路:
这题用二维数组存会超限,所以用邻接表存储图(这里搞了好久),剩下的事便很简单了,用vis表示到当前景点经过的最大的景点数,每次删除边时用一个简单的状态转移就可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 0x3f3f3f3f;
struct node{
int to,next;
}g[200010];
int in_degree[100100];
int vis[100100];
int head[200010];
queue<int>q;
int cnt;
void add(int x,int y)
{
g[++cnt].next = head[x];
g[cnt].to = y;
head[x] = cnt;
}
int flag[100010];
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
add(x,y);
in_degree[y]++;
}
for(int i = 1; i <= n; i++)
{
if(in_degree[i] == 0)
{
q.push(i);
vis[i] = 1;
}
}
while(q.size())
{
int now = q.front();
q.pop();
for(int i = head[now]; i; i = g[i].next)
{
in_degree[g[i].to]--;
vis[g[i].to] = max(vis[g[i].to], vis[now]+1);
if(!in_degree[g[i].to])
{
q.push(g[i].to);
}
}
}
for(int i = 1; i <= n; i++)
cout<<vis[i]<<endl;
}