暖黑色

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

染色问题

基准时间限制: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;
}

 

posted on 2016-09-29 13:44  暖黑色  阅读(339)  评论(0编辑  收藏  举报