10pts求条
查看原帖
10pts求条
773300
Qzh2102楼主2025/7/26 10:55
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) x&(-x)
const int mxn=2e5+114;
const int md=1e9+7;
int n,m,rd[mxn];
bool vis[mxn];
vector <int> e[mxn];
vector <int> disc[mxn];
vector <int>ansl;
bool check(int le)
{
	for (int i=1;i<=n;i++) e[i].clear();
	memset(rd,0,sizeof(rd));
	memset(vis,0,sizeof(vis));
	int las;
	for (int i=1;i<=le;i++)
	{
		las=0;
		for (auto x:disc[i])
		{
			if (las==0) 
			{
				las=x;continue;
			}
			e[las].push_back(x);
			rd[x]++;
			las=x;
		}
	}
	for (int i=1;i<=n;i++)
	{
		sort(e[i].begin(),e[i].end());
	}
	queue <int> q;
	for (int i=1;i<=n;i++)
	{
		if (rd[i]==0) q.push(i);
	}
	vector <int> tmp;
	while (!q.empty())
	{
		int u=q.front();q.pop();
		if (vis[u]) continue;
		tmp.push_back(u);
		vis[u]=1;
		for (auto v:e[u])
		{
			rd[v]--; 
			if (!vis[v]) q.push(v);
		}
	}
	for (int i=1;i<=n;i++) if (vis[i]==0) return 0;
	ansl=tmp;return 1;
}
inline void solve()
{
	cin>>n>>m;
	for (int i=1;i<=m;i++)
	{
		int x;cin>>x;
		while (x--) 
		{
			int v;cin>>v;
			disc[i].push_back(v);
		}
	}
	int l=1,r=m,ans=-0;
	while (l<r)
	{
		int mid=(l+r)/2;
		if (check(mid))
		{
			ans=mid;l=mid+1;
		}
		else r=mid-1;
	}
	check(ans); 
	for (auto x:ansl) cout<<x<<" ";
	return void();
}
signed main()
{
	cin.tie(0);cout.tie(0);
	ios::sync_with_stdio(0);
	int t=1;
//	cin>>t;
	while (t--) solve();
	return 0;
}

二分+拓扑

2025/7/26 10:55
加载中...