我是靠谱客的博主 傻傻小猫咪,最近开发中收集的这篇文章主要介绍D. Robot Rapping Results Report(拓扑排序+二分),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题有明显的单调性,考虑每次用拓扑排序检验正确性

Ⅰ . 如 果 拓 扑 排 序 结 束 , 还 有 点 没 被 入 队 过 , 说 明 有 环 , 有 环 是 无 法 确 定 的 Ⅰ.如果拓扑排序结束,还有点没被入队过,说明有环,有环是无法确定的 .,,,

Ⅱ . 每 次 删 掉 一 个 点 后 , 会 把 周 围 点 的 入 度 减 减 , 但 是 一 次 最 多 只 有 一 个 点 入 度 变 成 0. Ⅱ.每次删掉一个点后,会把周围点的入度减减,但是一次最多只有一个点入度变成0. .,,0.

如 果 多 于 这 个 数 , 那 么 这 几 个 点 处 于 同 一 层 级 , 无 法 判 断 能 力 强 弱 如果多于这个数,那么这几个点处于同一层级,无法判断能力强弱 ,,

//怎样能确定?
//一、没有环
//二、只有一个入度为1的点
//三、每次只会加入一个点
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10; 
int n,m,l[maxn],r[maxn],in[maxn];
vector<int>vec[maxn];
bool tuopu()
{
	queue<int>q;
	int temp=0;
	for(int i=1;i<=n;i++)
		if( in[i]==0 )	temp++,q.push(i);
	if( temp!=1 )	return false;	
	while( !q.empty() )
	{
		int u=q.front(),lin=0; q.pop();
		for(int i=0;i<vec[u].size();i++)
		{
			int v=vec[u][i];
			if( --in[v]==0 )	q.push(v),temp++,lin++;
		}
		if( lin>1 )	return false;
	}
	if( temp!=n )	return false;
	return true;
} 
void init(int mid)
{
	for(int i=1;i<=n;i++)	vec[i].clear(),in[i]=0;
	for(int i=1;i<=mid;i++)
	{
		vec[ r[i] ].push_back( l[i] );
		in[ l[i] ]++;
	}
}
int main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
		scanf("%d%d",&l[i],&r[i]);
	int L=1,R=m,mid,ans=-1;
	while( R>=L )
	{
		mid=L+R>>1;
		init(mid);
		if( tuopu() )	R=mid-1,ans=mid;
		else	L=mid+1;
	}
	cout << ans;
} 

最后

以上就是傻傻小猫咪为你收集整理的D. Robot Rapping Results Report(拓扑排序+二分)的全部内容,希望文章能够帮你解决D. Robot Rapping Results Report(拓扑排序+二分)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部