OpenJudge 1975 Median Weight Bead

来源:互联网 发布:郑州做seo的工资 编辑:程序博客网 时间:2024/05/16 05:03

描述
There are N beads which of the same shape and size, but with different weights. N is an odd number and the beads are labeled as 1, 2, …, N. Your task is to find the bead whose weight is median (the ((N+1)/2)th among all beads). The following comparison has been performed on some pairs of beads:
A scale is given to compare the weights of beads. We can determine which one is heavier than the other between two beads. As the result, we now know that some beads are heavier than others. We are going to remove some beads which cannot have the medium weight.

For example, the following results show which bead is heavier after M comparisons where M=4 and N=5.
1. Bead 2 is heavier than Bead 1.
2. Bead 4 is heavier than Bead 3.
3. Bead 5 is heavier than Bead 1.
4. Bead 4 is heavier than Bead 2.

From the above results, though we cannot determine exactly which is the median bead, we know that Bead 1 and Bead 4 can never have the median weight: Beads 2, 4, 5 are heavier than Bead 1, and Beads 1, 2, 3 are lighter than Bead 4. Therefore, we can remove these two beads.

Write a program to count the number of beads which cannot have the median weight.
输入
The first line of the input file contains a single integer t (1 <= t <= 11), the number of test cases, followed by the input data for each test case. The input for each test case will be as follows:
The first line of input data contains an integer N (1 <= N <= 99) denoting the number of beads, and M denoting the number of pairs of beads compared. In each of the next M lines, two numbers are given where the first bead is heavier than the second bead.
输出
There should be one line per test case. Print the number of beads which can never have the medium weight.
样例输入
1
5 4
2 1
4 3
5 1
4 2
样例输出
2
来源
Tehran Sharif 2004 Preliminary


写出来一道纯英文的题目就显得很有逼格..

二维数组a[i][j]=1表示i比j重,=0则表示不知道i和j哪个重
用Floyed传递闭包来求出i和j哪个重
然后枚举数组中的元素,a[i][j]==1 的话i的出度++、j的入度++
最后度大于等于(n+1)/2的都肯定不会是中间重量的

Ac代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN=100+5;bool a[MAXN][MAXN];int main(){    int T;    scanf("%d",&T);    while(T--)    {        int m,n;        scanf("%d%d",&n,&m);        int cmp=(n+1)/2;        for(int i=1;i<=n;i++)               //初始化            for(int j=1;j<=n;j++) a[i][j]=0;//用memset也可以        for(int i=1;i<=m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            a[u][v]=1;                      //emm..u比v重        }        for(int k=1;k<=n;k++)               //Floyed传递闭包            for(int i=1;i<=n;i++)                for(int j=1;j<=n;j++)                    a[i][j]=(a[i][j]||(a[i][k]&&a[k][j]));        int ans=0,in[MAXN],out[MAXN];        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)            {                if(a[i][j]&&i!=j)                    out[i]++,in[j]++;            }        for(int i=1;i<=n;i++)            if(in[i]>=cmp||out[i]>=cmp) ans++;        printf("%d\n",ans);                 //不要忘记换行    }    return 0;}