求助,我这个思路有问题吗
  • 板块CF1572A Book
  • 楼主OIer_Hhy
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/17 17:04
  • 上次更新2024/9/17 20:12:23
查看原帖
求助,我这个思路有问题吗
681941
OIer_Hhy楼主2024/9/17 17:04

用的拓扑排序 + 最长上升子序列

一直过不去

#include<bits/stdc++.h>
// #define DEBUG
using namespace std;
int n;
vector<vector<int> >e;
vector<int> deg;
vector<int> ans;
vector<int> dp;
int calc(){
	dp.assign(n+5,0);
	dp[0]=INT_MAX;
	int cnt=0;
    for(int i=0;i<n;i++){
        if(ans[i]<=dp[cnt]) dp[++cnt]=ans[i];
        else{
            int l=1,r=cnt;
            while(l<r){
                int mid=(l+r)>>1;
                if(dp[mid]<ans[i]) r=mid;
                else l=mid+1;
            }
            dp[l]=ans[i];
        }
    }
    return cnt;
}
bool toposort(){
	ans.clear();
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i=1;i<=n;i++){
		if(!deg[i]) q.emplace(i);
	}
	while(!q.empty()){
		int u=q.top();q.pop();
		cout<<u<<' ';
		ans.emplace_back(u);
		for(int v:e[u]){
			if(!--deg[v]) q.emplace(v);
		}
	}
	return ans.size()==n;
}
void solve(){
	cin>>n;
	deg.assign(n+5,0);
	e.assign(n+5,vector<int>());
	for(int i=1,cnt;i<=n;i++){
		cin>>cnt;
		for(int j=1,v;j<=cnt;j++){
			cin>>v;
			e[v].emplace_back(i);
			deg[i]++;
		}
	}
	for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end());
	if(!toposort()){
		cout<<-1<<'\n';
		return ;
	}
	#ifdef DEBUG
	for(int i:ans) cout<<i<<' ';
	cout<<'\n';
	#endif
	cout<<calc()<<'\n';
}
int main(){
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}
/*
1
5
1 2
1 5
2 4 1
1 2
0
*/

2024/9/17 17:04
加载中...