HDU 6152 Friend-Graph Ramsey定理 组合数学
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6152
题目描述: 一个团队如果存在三个或者三个以上的人互为朋友的关系,或者都不是朋友的关系,那么就说明这个团队是一个坏团队,否则输出好团队
解题思路: 根据Ramsey定理, R(3,3) == 6 所以如果人数大于等于6, 一定会出现3个以上团或者人数大于三个人的团, 剩下小于6的乱搞一下就可以了
代码:
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator> #include <cmath> #include <algorithm> #include <stack> #include <deque> #include <map> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define meminf(a) memset(a,0x3f,sizeof(a)) #define fi(n) for(i=0;i<n;i++) #define fj(m) for(j=0;j<m;j++) #define sca(x) scanf("%d",&x) #define scalld(x) scanf("%I64d",&x) #define print(x) printf("%d\n",x) #define printlld(x) printf("%I64d\n",x) #define de printf("=======\n") typedef long long ll; using namespace std; //const int maxn = 3e7; //const int m = 1e9+7; const int maxn = 20; int a[maxn][maxn]; int main() { int t; sca(t); while( t-- ) { int n; sca(n); mem0(a); if( n > 6 ) { int temp; for( int i = 1; i <= n; i++ ) { for( int j = i+1; j <= n; j++ ) { sca(temp); } } printf( "Bad Team!\n" ); continue; } for( int i = 1; i <= n; i++ ) { for( int j = i+1; j <= n; j++ ) { sca(a[i][j]); a[j][i] = a[i][j]; } } bool flag = 0; for( int i = 1; i <= n; i++ ) { for( int j = i+1; j <= n; j++ ) { for( int k = j+1; k <= n; k++ ) { if( a[i][j] && a[j][k] && a[i][k] ) { flag = 1; } } } } if( flag == 1 ) { printf( "Bad Team!\n" ); // continue; } else { for( int i = 1; i <= n; i++ ) { for( int j = i+1; j <= n; j++ ) { for( int k = j+1; k <= n; k++ ) { if( !a[i][j] && !a[j][k] && !a[i][k] ) { flag = 1; } } } } if( flag == 1 ) { printf( "Bad Team!\n" ); } else { printf( "Great Team!\n" ); } } } return 0; }
思考: 今天北交的学长要讲组合数学了啊,好好好好听着一定要! 刚刚还注意到了一个坑点, 如果只有一个输入的话数组开不下3000*3000, 如果只有一个 输入但是数组是20*20的话, 再输入3000的数组时候, 会返回TLE, 个人认为读取数据的时候找不到可以放得地方就一直等待,(猜测哈)
posted on 2017-08-20 15:16 FriskyPuppy 阅读(242) 评论(0) 编辑 收藏 举报