萌新刚学OIqwq,简单拓扑排序+DP抱灵求助QAQ
  • 板块P1137 旅行计划
  • 楼主DYYqwq
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/2/1 14:24
  • 上次更新2023/10/24 02:14:08
查看原帖
萌新刚学OIqwq,简单拓扑排序+DP抱灵求助QAQ
719978
DYYqwq楼主2023/2/1 14:24

rt

注意:不要理会代码中那些奇奇怪怪的注释(

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int to , nxt;
}e[200100];
int n , m;
int head[200010] , tot = 0;
int rudu[100010] , topological[100010];
queue<int> q;
int cnt = 0;
int dp[100010];
void add(int u , int v)
{
	++ tot;
	e[tot].to = v;
	e[tot].nxt = head[u];
	head[u] = tot;
}
void Topological_sort()
{
	for(int i = 1 ; i <= n ; i ++)
	{ 
		if(rudu[i] == 0) // 入度(手)为0,第一个被砍头( 
		{
			q.push(i); // 载入史册( 
			topological[++ cnt] = i; // 拓扑排序被砍头的第一人(点)! 
		}
	} 
	while(!q.empty()) // 赶尽杀绝 
	{
		int u = q.front(); // 找到部队头领 
		q.pop(); // 寄! 
		for(int i = head[u] ; i != 0 ; i = e[i].nxt) // 诛九族! 
		{
			int v = e[i].to; // 上一个点是吧 
			rudu[v] --; // 砍手! 
			if(rudu[v] == 0) // 手砍没了 , 就该砍头了( 
			{
				q.push(v); // 载入史册( 
				topological[++ cnt] = v; // 拓扑排序被砍头的第cnt人(点)! 
			}
		}
	}
}
void input()
{
	scanf("%d%d" , &n , &m);
	for(int i = 1 ; i <= m ; i ++)
	{
		int u , v;
		scanf("%d%d" , &u , &v);
		add(u , v);
		rudu[v] ++; // 这个人手的只数+1((( 
	}
}
void init()
{
	for(int i = 1 ; i <= n ; i ++)
		dp[i] = 1;
}
void dp_qwq()
{
	for(int i = 1 ; i <= n ; i ++)
	{
		int u = topological[i];
		for(int i = head[u] ; i != 0 ; i = e[i].nxt)
		{
			int v = e[i].to;
			dp[v] = max(dp[u] + 1 , dp[v]);
		}
		printf("%d\n" , dp[i]);
	}
}
void check()
{
	for(int i = 1 ; i <= n ; i ++)
		printf("%d " , topological[i]);
}
int main()
{
	input();
	Topological_sort();
	init();
	dp_qwq();
	// check();
	// 有Python那味了( 
	return 0;
}
2023/2/1 14:24
加载中...