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;
}