一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n),最终使得所有三个点构成的环(C(n,3)个不同的环)上三条边的颜色和在所有颜色中任选三种颜色的组合(C(n,3)种方案)一一对应,由你来给出染色方案。
本题有多组数据
Input
第一行一个整数T,表示数据组数 接下来T行每行一个整数n,表示完全图的点数
Output
输出由T个部分组成 每个部分的第一行一个整数n,表示完全图的点数 第二行表示构造结果 如果无解输出No solution 否则输出n*(n-1)/2条边的起点、终点和颜色
Input示例
2 4 3
Output示例
4 No solution 3 1 2 3 2 3 1 3 1 2
QwX
(题目提供者)
C++的运行时限为:1000 ms ,空间限制为:10240 KB
示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
首先我们知道偶数的话一定构造不出来,奇数的话没了避免重复,我们可以枚举点然后累加。
按照顺序来的话就OK了。
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define maxn 1050
#define lowbit(x) (x&-x)
#define eps 1e-9
int a[105][105],used[105];
int main(void)
{
int T,n,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
printf("%d\n",n);
if(n%2==0)
printf("No solution");
else
{
int num=1;
for(i=1;i<n;i++)
{
int tmp=num;
for(j=i+1;j<=n;j++)
{
printf("%d %d %d ",i,j,tmp);
tmp=(tmp+1)%n;
if(tmp==0)
tmp=n;
}
num=(num+2)%n;
if(num==0)
num=n;
}
}
printf("\n");
}
return 0;
}