染色问题
基准时间限制: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[1005]; 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%2==0) cout<<"No solution"<<endl; else { t=1; for(i=1;i<n-1;i++) { k=t; for(j=i+1;j<=n;j++) { cout<<i<<" "<<j<<" "<<k<<" "; k=(k+1)%n; if(k==0) k=n; } t=(t+2)%n; if(t==0) t=n; } cout<<n-1<<" "<<n<<" "<<k<<endl; } } return 0; }