hdu 4324 Triangle LOVE

http://acm.hdu.edu.cn/showproblem.php?pid=4324

比赛的时候 脑子又短路了 

“between A and B, if A don’t love B, then B must love A”  这句话读题的时候倒是看到了

思考方法的时候却忘了 伤不起呀

我们把喜欢自己的人数定为入度的话 

假设到了第n+1个人 那么前n个人 两两之间必须存在一个喜欢指向 所以不考虑其它的话

他们的入度和 为(n-1)*n/2 如果比这个大的话那说明 有其他人k喜欢这里面的人

那个人k一定是第n+1个人喜欢的 所以有Triangle LOVE  

关键在于到了的n+1个人时 前n个人 要么喜欢他 要么他喜欢

就是忽略了这点呀

代码:

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<ctime>

#include<queue>

#include<cstring>

#include<set>

#include<string>

#include<cmath>

#include<algorithm>

#define LL long long



using namespace std;



const int N=2005;

char s[N][N];

int insum[N];//前面喜欢自己的人数

int main()

{

    //freopen("data.txt","r",stdin);

    int T;

    scanf("%d",&T);

    for(int w=1;w<=T;++w)

    {

        int n;

        scanf("%d",&n);

        getchar();

        for(int i=0;i<n;++i)

        {

            gets(s[i]);

        }

        bool flag=false;

        for(int i=0;i<n;++i)

        {

            int sumtemp=0;

            for(int j=0;j<i;++j)

            {

                if(s[j][i]=='1')

                sumtemp+=insum[j];//分两组 记录喜欢自己那组的入度和

            }

            if(sumtemp>(i-1)*i/2)//比(i-1)×i/2 还要大的话 说明有另一组的人喜欢他们其中的人 而另一组的人一定是第i+1个人喜欢的   所以存在Traingle LOVE

            {

                flag=true;

                break;

            }

            insum[i]=0;

            for(int j=0;j<n;++j)

            {

                if(s[i][j]=='0'&&i!=j)

                {

                    ++insum[i];

                }

            }

        }

        printf("Case #%d: ",w);

        if(flag)

        printf("Yes\n");

        else

        printf("No\n");



    }

    return 0;

}

  

你可能感兴趣的:(love)