floyd 传递闭包
/*
poj1975 Median Weight Bead
题意:有N个珠子,N为奇数(an odd number),给出一些信息如a b表示a比b重,
通过这些信息可以分析出那些珠子按重量排序后,哪个不可能是中间那个,求可以分析出几个。
用到的是floyd求传递闭包,然后找到那些入度或出度大于n/2的珠子即可
*/
题意:有N个珠子,N为奇数(an odd number),给出一些信息如a b表示a比b重,
通过这些信息可以分析出那些珠子按重量排序后,哪个不可能是中间那个,求可以分析出几个。
用到的是floyd求传递闭包,然后找到那些入度或出度大于n/2的珠子即可
*/
#include<stdio.h>
#include<string.h>
int g[100][100];//g[i][j]表示j比i轻
void floyd(int n)
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=(g[i][j]||(g[i][k]&&g[k][j]));//若j已经比i轻,或有个k可以实现j比k轻,k比i轻,可得j比i轻
}
int main()
{
int a,b,t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
memset(g,0,sizeof(g));
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
g[a][b]=1;
}
floyd(n);
int ans=0;
for(i=1;i<=n;i++)
{
int da=0,xiao=0;
for(j=1;j<=n;j++)
if(g[i][j])
xiao++;
else if(g[j][i])
da++;
if(da>n/2||xiao>n/2)
ans++;
}
printf("%d\n",ans);
}
return 0;
}