题目大意
给你一个有n个点的完全图
求一种方案是的给边染色后任何一点不能沿一种颜色的边走奇数条边回到这个点
要求颜色数最少
分析
考场上输出格式打错见祖宗...
我们每次找一个最大二分图将其染一个新颜色即可
找的方式就是每次将一个集合分为左右两边
将这两个集合分别作为左边点和右边点连成二分图
然后递归每一个子区间
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int vis[1100][1100],n;
inline void go(int le,int ri,int wh){
if(le>=ri)return;
int i,j,k,mid=(le+ri)>>1;
for(i=le;i<=mid;i++)
for(j=mid+1;j<=ri;j++)
vis[i][j]=vis[j][i]=wh;
go(le,mid,wh+1);
go(mid+1,ri,wh+1);
}
int main(){
int i,j,k;
scanf("%d",&n);
go(1,n,1);
for(i=1;i<n;i++){
for(j=1;j+i<n;j++)
printf("%d ",vis[i][j+i]);
printf("%d
",vis[i][n]);
}
return 0;
}