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

  

原文地址:https://www.cnblogs.com/liulangye/p/2617431.html