2017中国大学生程序设计竞赛 - 网络选拔赛 [1003 - Friend-Grapht] 图论

题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=779

题目大意:给一个团队的关系图,问这个团队是不是好团队,判定依据是这个团队没有三个人互相认识,也没有三个人互相不认识,则为好团队。

关键思想:根据Ramsey定理,当n>=6时,一定存在“3个人互相认识或3个人互相不认识”。故当n>=6时,只需输出"Bad Team",当n<6时,对原图及其补图DFS暴力就行了,如果四层回不到自己,就说明自己不在小圈子里。

代码如下:

 

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;

int Relation[6][6];
bool vis[6]; 
bool flag;
int T,n;

void DFS(int start,int now,int cnt){//起点,当前点,环的长度 
    if(!flag)return; 
    if(cnt==4&&now==start){
        flag=false;
        return;
    }
    for(int i=0;i<n;i++){
        if(Relation[now][i]&&!vis[i]){
            vis[i]=true;
            DFS(start,i,cnt+1);
            vis[i]=false;
        } 
    }
    return;
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                scanf("%d",&Relation[i][j]);
                Relation[j][i]=Relation[i][j];    
            }
        }
        if(n>=6){//Ramsey定理 
            cout<<"Bad Team!"<<endl;
            continue;
        }
        flag=true;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++){
            if(flag) 
                DFS(i,i,1);//从i开始,环长度为1 
        }
        if(flag)cout<<"Great Team!"<<endl;
        else cout<<"Bad Team!"<<endl;
    }
    return 0;
} 

循环暴力也能过

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
int T, n;
bool Relation[3010][3010];

int main() {
    scanf("%d", &T);
    while (T--) {
        memset(Relation,0,sizeof(Relation));
        scanf("%d", &n);
        for (int i=0;i<n;i++) {
            for (int j=i+1;j<n;j++) {
                scanf("%d", &Relation[i][j]);
            }
        }
        bool flag = true;
        for (int i=0;i<n;i++) {
            for (int j=i+1;j<=n;j++) {
                for (int k=j+1;k<=n;k++) {
                    if (!Relation[i][j] && !Relation[i][k] && !Relation[j][k]) {
                        flag=false;
                        break;
                    }
                    if (Relation[i][j] && Relation[i][k] && Relation[j][k]) {
                        flag=false;
                        break;
                    }
                }
                if(flag)break; 
            }
            if(flag)break;
        }
        if (flag) printf("Great Team!\n");
        else printf("Bad Team!\n");
    }
    return 0;
}

 

posted @ 2017-08-19 20:21  哇咔咔咔  阅读(221)  评论(0编辑  收藏  举报