zoukankan      html  css  js  c++  java
  • 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
    ",x)
    #define printlld(x) printf("%I64d
    ",x)
    #define de printf("=======
    ")
    
    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!
    " );
                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!
    " );
                //            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!
    " );
                }
                else {
                    printf( "Great Team!
    " );
                }
            }
        }
        return 0;
    }
    View Code

      思考: 今天北交的学长要讲组合数学了啊,好好好好听着一定要! 刚刚还注意到了一个坑点, 如果只有一个输入的话数组开不下3000*3000, 如果只有一个 输入但是数组是20*20的话, 再输入3000的数组时候, 会返回TLE, 个人认为读取数据的时候找不到可以放得地方就一直等待,(猜测哈)

  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7400153.html
Copyright © 2011-2022 走看看