HDU 6152 - Friend-Graph

Friend-Graph

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3072    Accepted Submission(s): 1334

Problem Description
It is well known that small groups are not conducive of the development of a team. Therefore, there shouldn’t be any small groups in a good team.
In a team with n members,if there are three or more members are not friends with each other or there are three or more members who are friends with each other. The team meeting the above conditions can be called a bad team.Otherwise,the team is a good team.
A company is going to make an assessment of each team in this company. We have known the team with n members and all the friend relationship among these n individuals. Please judge whether it is a good team.
Input
The first line of the input gives the number of test cases T; T test cases follow.(T<=15)
The first line od each case should contain one integers n, representing the number of people of the team.(n3000)

Then there are n-1 rows. The ith row should contain n-i numbers, in which number aij represents the relationship between member i and member j+i. 0 means these two individuals are not friends. 1 means these two individuals are friends.
Output
Please output ”Great Team!” if this team is a good team, otherwise please output “Bad Team!”.
Sample Input
1 4 1 1 0 0 0 1
Sample Output
Great Team!
#include <iostream>
#include <cstdio>
using namespace std;

bool a[3005][3005];
int main()
{    int T;
    scanf("%d",&T);
    while(T>0){
        int flag=1;
        int N;
        scanf("%d",&N);
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                a[i][j]=0;
            }
        }
        for(int b=0;b<N;b++)
            for(int d=b+1;d<N;d++){
                scanf("%d",&a[b][d]);
                a[d][b]=a[b][d];
            }
        for(int c=0;c<N;c++)
            for(int q=c+1;q<N;q++)
                for(int k=q+1;k<N;k++){
                    int ans=a[c][q]+a[q][k]+a[c][k];
                    if(ans==3||ans==0){
                        flag=0;
                        c=N;
                        q=N;
                        break;
                    }
                }
        if(flag) printf("Great Team!\n");
        else printf("Bad Team!\n");

    T--;
    }
    return 0;
}
1、这个二维数组a只能用bool定义,用int定义会超,bool只占一个字节
2、bool的取值、和int可以直接相互转换
3、用ans把三个取值加起来,会比直接比较精简
4、注意三个for那里的q、k初始化的值
 
改进:
根据Ramsey定理(组合数学的知识),因为当人数大于等于6时,答案一定是否,所以,可以大大缩小空间
#include <iostream>
#include <cstdio>
using namespace std;

bool a[5][5];
int main()
{    int T;
    scanf("%d",&T);
    while(T>0){
        int flag=1;
        int N;
        scanf("%d",&N);
        if(N>5){
            flag=0;
        }else{
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                a[i][j]=0;
            }
        }
        for(int b=0;b<N;b++)
            for(int d=b+1;d<N;d++){
                scanf("%d",&a[b][d]);
                a[d][b]=a[b][d];
            }
        for(int c=0;c<N;c++)
            for(int q=c+1;q<N;q++)
                for(int k=q+1;k<N;k++){
                    int ans=a[c][q]+a[q][k]+a[c][k];
                    if(ans==3||ans==0){
                        flag=0;
                        c=N;
                        q=N;
                        break;
                    }
                }
        }
        if(flag) printf("Great Team!\n");
        else printf("Bad Team!\n");

    T--;
    }
    return 0;
}

 

posted @ 2019-03-29 17:42  小碧  阅读(123)  评论(0编辑  收藏  举报