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;
    }
  • 相关阅读:
    下载PDF格式的Html
    EnumHelper.cs
    FtpHelper.cs
    Windows下用cmd命令安装及卸载服务
    c# list排序
    用NOPI将图片二进制流导出到Excel
    jquery的clone方法 于textarea和select的bug修复
    时间戳格式化函数
    快速激活Navicat Premium 12
    防止应用程序重复打开
  • 原文地址:https://www.cnblogs.com/lmhbk/p/5919633.html
Copyright © 2011-2022 走看看