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;
}
浙公网安备 33010602011771号