P2419 Cow Contest S

挺有意思的,记一下。

P2419 Cow Contest S

题目大意:

\(n(n\le 100)\) 个数,告诉你 \(m\) 条某两个数的大小关系,问你有多少数的排名是可以确定的(保证不会冲突)。

题目思路:

首先,我们肯定是可以直接拓扑,那就是变成了问你拓扑时有多少数是单独一层的(本次只有它这一个数入队),但是我们还有更简单的的方法。

考虑对于每一条信息 \(u>v\),由 \(u\)\(v\) 连一条边,这样我们就获得了一个图,因为保证不会冲突,所以这还是个 \(DAG\)

可以发现,从某一点出发,所有可达的点排名都比这个点小,因为大小关系是有传递性的。

所以直接求连通性,如果对于某一点 \(u\),对于所有 \(v(v\not= u)\)\(v\) 能到达 \(u\) 或者 \(u\) 能到达 \(v\),则 \(u\) 的排名是确定的。

Code:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int rt=0;	char g=getchar();
	while(g<'0'||g>'9')	g=getchar();
	while(g>='0'&&g<='9')	rt=(rt<<3)+(rt<<1)+g-'0',g=getchar();
	return rt;
}
int n,m,ans;
bool a[105][105];
int main()
{
	n=read();	m=read();
	for(int i=1,u,v;i<=m;i++)
	{
		u=read();v=read();
		a[u][v]=1;
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				a[i][j]|=a[i][k]&a[k][j];
	bool kk;
	for(int i=1;i<=n;i++)
	{
		kk=1;
		for(int j=1;j<=n;j++)
		{
			if(i==j)	continue;
			kk&=a[i][j]|a[j][i];
		}
		ans+=kk;
	}
	printf("%d",ans);
	return 0;
}
posted @ 2024-08-23 20:02  YT0104  阅读(6)  评论(0编辑  收藏  举报