1 条题解

  • 0
    @ 2025-5-13 14:08:24

    这道题要求为憨憨规划一条骑行路线,从某个路口出发,仅往东骑行,经过尽可能多的路口后到达终点路口 i。

    我们可以利用图论中的拓扑排序处理节点依赖关系,并结合动态规划思想计算最长路径。由于题目中每个路口只能往东骑行,整张图就是一个有向无环图。通过拓扑排序可确保在处理某个节点时,其所有前驱节点均已处理完毕,从而利用动态规划来求解。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int n,m,d[N],ans[N];
    vector<int> edge[N];
    
    void TopologicalSort()
    {
    	queue<int> q;
    	for(int i=1;i<=n;i++)
    	{
    		if(d[i]==0)//将入度为0的点加入队列
    		{
    			ans[i]=1;
    			q.push(i); 
    		}
    	}
    	
    	while(q.size())
    	{
    		int now=q.front();
    		q.pop();
    		
    		for(int i:edge[now])
    		{
    			d[i]--;
    			if(d[i]==0) q.push(i);//有新的入度为0的点,继续加入队列
    			ans[i]=max(ans[i],ans[now]+1);//更新答案
    		}
    	}
    }
    
    int main()
    {
    	cin>>n>>m;
    	while(m--)
    	{
    		int x,y;
    		cin>>x>>y;
    		d[y]++;//统计入度
    		edge[x].push_back(y);//单向边
    	}
    	TopologicalSort();//拓扑排序
    	for(int i=1;i<=n;i++)
    	{
    		cout<<ans[i]<<endl;//输出答案
    	}
    }
    
    • 1

    信息

    ID
    146
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    13
    已通过
    6
    上传者