51nod 算法马拉松18 A 染色问题

时间:2024-04-27 23:07:56

染色问题

基准时间限制:1 秒 空间限制:10240 KB 分值: 40
一个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

一开始看这个题又是环又是图又是排列组合的还以为很麻烦,不过读完题发现其实没有那么复杂。题目的样例也完全不用纠结,输入3可以像样例那样输出,也完全可以按自己想的颜色输出(我的程序跑3的结果就是1 2 1 1 3 2 2 3 3,但是可以AC)。然后再找一下规律,就是两个点间染一个颜色,然后以这两个点为一个端点的线都不能再染这个颜色了,这样下来就是自己找规律看如何填颜色了。如果输入的是偶数那么无论如何都做不到这一点,所以偶数就直接输出"No solution"就好了,奇数的话再找下规律,我是先顺着填的颜色,最后填完发现颜色数量正好再观察下我画的表的规律,写出了程序。

下面是我以输入7为例填的表格,两边表示两个点,里面的代号是这两个点间边的颜色

  1 2 3 4 5 6 7
1 \ 1 2 3 4 5 6
2 1 \ 3 4 5 6 7
3 2 3 \ 5 6 7 1
4 3 4 5 \ 7 1 2
5 4 5 6 7 \ 2 3
6 5 6 7 1 2 \ 4
7 6 7 1 2 3 4 \

填颜色的方法应该不止一种,找出来一种就好了,然后我根据我的表的规律写的代码,下面是AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[]; int main()
{
int T;
int n;
int i,j;
int k,t;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cout<<n<<endl;
if(n%==)
cout<<"No solution"<<endl;
else
{
t=;
for(i=;i<n-;i++)
{
k=t;
for(j=i+;j<=n;j++)
{
cout<<i<<" "<<j<<" "<<k<<" ";
k=(k+)%n;
if(k==)
k=n;
}
t=(t+)%n;
if(t==)
t=n;
}
cout<<n-<<" "<<n<<" "<<k<<endl;
}
}
return ;
}