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; }
边完善自己边认识自己