P1137 旅行計劃(拓撲排序&dp)

P1137 旅行計劃(拓撲排序&dp)

傳送門

思路:顯然是用拓撲排序,又因爲要記錄以每個結點爲終點的拓撲排序最大結點數,顯然可以用一個簡單dpdp轉移實現。

即:dp[v]=max(dp[v],dp[u]+1)dp[v]=max(dp[v],dp[u]+1)

然後隨便搞搞就出來了。

時間複雜度:O(n+m)O(n+m)

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
int n,m,in[N],dp[N];
vector<int>e[N];
void toposort(){
	queue<int>q; 
	for(int i=1;i<=n;i++) if(!in[i]) q.push(i),dp[i]++;
	while(q.size()){
		int u=q.front();q.pop();
		for(auto v:e[u]){
			dp[v]=max(dp[v],dp[u]+1);
			in[v]--;
			if(!in[v]) q.push(v); 
		}
	}
} 
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++){
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		in[v]++;
	}
	toposort();
	for(int i=1;i<=n;i++)
		printf("%d\n",dp[i]);
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章