poj1975 Median Weight Bead ----floyd 传递闭包

/*
poj1975 Median Weight Bead
题意:有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;
}


你可能感兴趣的:(poj1975 Median Weight Bead ----floyd 传递闭包)