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 longusing 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");elseprintf("No\n");}return 0;
}