zoukankan      html  css  js  c++  java
  • 51nod 算法马拉松18 A 染色问题

    染色问题

    基准时间限制: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;
    }
  • 相关阅读:
    今天入住博客园,希望有个好的开始,自己在这边可以学习成长
    浅谈 C# ref 和 out 的使用方法
    类之间的几种关系
    VB6.0 文件日志读取
    基于NPOI的Excel导入和导出功能
    WebService的创建,发布与调用
    C# OfType 的使用
    Vb6.0 文件日志记录
    ZipInputStream
    [转载]遗传算法入门
  • 原文地址:https://www.cnblogs.com/lmhbk/p/5919633.html
Copyright © 2011-2022 走看看