@[TOC] 竞赛图
竞赛图上的枚举
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int n;
int g[100][100];//记录整个图
int tris[10001][4];//记录所有的三角形
int tris_num; //记录找到的三角形的数目
int find_tri(){
int d = 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(g[i][j]==g[j][k] && g[j][k] == g[k][i]){
d++;
tris[d][1]=i;
tris[d][2]=j;
tris[d][3]=k;
}
return d;
}
int tri_func(){
tris_num = find_tri();//找到所有三角形
if(tris_num == 0)return 0;
//printf("%d\n",tris_num);
for(int i = 1;i<= tris_num;i++)
for(int j = i+1;j<=tris_num;j++){
if(tris[i][1] != tris[j][1] && tris[i][1] != tris[j][2] &&tris[i][1] != tris[j][3] &&
tris[i][2] != tris[j][1] && tris[i][2] != tris[j][2] &&tris[i][2] != tris[j][3] &&
tris[i][3] != tris[j][1] && tris[i][3] != tris[j][2] &&tris[i][3] != tris[j][3]){
return 2;
}
}
return 1;
}
int fvs_func(){
int s;
/* for(int i = 1;i<=n;i++){
s = 0;
for(int k = 1;k <= tris_num;k++){
if(tris[k][1]!=i && tris[k][2]!=i && tris[k][3]!= i){
s++;
}
}
if(s==0)return 1;
}
return 2;
*/
for(int i = 1;i<= n;i++)
for(int j = i+1;j<= n;j++){
s = 0;
for(int k = 1;k <= tris_num;k++){
if(tris[k][1]!=i && tris[k][2]!=i && tris[k][3]!= i &&
tris[k][1]!=j && tris[k][2]!=j && tris[k][3]!= j){
s++;
}
}
if(s==0)return 2;
}
return 3;
}
void construct_tournaments(){
long long edges_num = n *(n-1)/2;//二进制位数;
int d[10010];
int tri_opt, fvs_opt;
int c;
long long l; l = pow(2,edges_num)-1;
while(l >= 0){
memset(g,-1,sizeof(g));
for(int i = edges_num-1;i>=0;i--){
d[i] = (l>>i) & 1;
//printf("%d ",d[i]);
}
c = edges_num - 1;
for(int i = 1;i<=n;i++){
for(int j = i+1;j<=n;j++){
if(d[c]==1)g[i][j] = 1;
else g[j][i] = 1;
c--;
}
}
tri_opt = tri_func();
if (tri_opt != 1) {
l--;//printf("%d ",l);
continue;
};//2个的不考虑
fvs_opt = fvs_func();
if(fvs_opt == 3){
printf("yes!\n");
}//else printf(".");
l--;//printf("%d ",l);
//puts("");
}
}
int main()
{
scanf("%d",&n); //n个点
construct_tournaments();
}