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