hdu-6152 Friend-Graph
阿新 • • 發佈:2019-02-08
懂得越多,寫的越少
拉姆齊定理:6 個人中至少存在3人相互認識或者相互不認識。
所以當n大於等於6時一定存在一個大小大於等於三的團或獨立集,n小於6直接暴力就好了
#include<bits/stdc++.h> using namespace std; int a[2][10][10]; int main() { int T,n; int i,j,x,z,k; cin>>T; while(T--) { cin>>n; if(n<6) { memset(a,0,sizeof a); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { scanf("%d",&a[0][i][j]); a[0][j][i]=a[0][i][j]; a[1][i][j]=a[1][j][i]=!a[0][i][j]; } } int flog=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { for(z=0;z<2;z++) if(a[z][i][j]) { for(k=j+1;k<=n;k++) { if(k!=i&&a[z][k][j]&&a[z][k][i]) flog=1; } } } } if(flog) cout<<"Bad Team!"<<endl; else cout<<"Great Team!"<<endl; } else { for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { scanf("%d",&x); } } cout<<"Bad Team!"<<endl; } } }
非正解卡過,暴力判斷,列舉過的點可以去掉
#include<bits/stdc++.h> using namespace std; const int MAXN = 3005; typedef long long ll; const int mod = 1e9 + 7; bool g[MAXN][MAXN],g1[MAXN][MAXN]; int w[MAXN]; int n; int main() { int T; cin >> T; while(T--) { int ok=0; int x; cin >> n; for(int i = 1; i <= n; i++) { for(int j = i + 1; j <= n; j++) { scanf("%d", &x); if(x == 1) { g[i][j] = g[j][i] = true; } else { g1[i][j]=g1[j][i]=true; } } } int m=0; for(int i = 1; i <= n; i++) { m=0; for(int j = 1; j <= n; j++) { if(g[i][j]) { w[m++]=j; } } for(int j=0;j<m;j++) { for(int k=j+1;k<m;k++) { if(g[w[j]][w[k]]) { ok=1; break; } else { g[i][w[j]]=g[w[j]][i]=false; g[i][w[k]]=g[w[k]][i]=false; } } if(ok) break; } if(ok) break; } if(ok==0) for(int i = 1; i <= n; i++) { m=0; for(int j = 1; j <= n; j++) { if(g1[i][j]) { w[m++]=j; } } for(int j=0;j<m;j++) { for(int k=j+1;k<m;k++) { if(g1[w[j]][w[k]]) { ok=1; break; } else { g1[i][w[j]]=g1[w[j]][i]=false; g1[i][w[k]]=g1[w[k]][i]=false; } } if(ok) break; } if(ok) break; } if(ok) cout << "Bad Team!\n"; else cout << "Great Team!\n"; memset(g, false, sizeof g); memset(g1, false, sizeof g1); } }