• AOJ894 种花【图的搜索+回溯】


    题面:

    花老师有一个农场,农场的花一共有 4 种颜色, 花老师不喜欢老旧的东西,所以,她希望每天种花的方案都不一样。特别地,她也觉得两种一样颜色的花种在相邻的位置会很无聊。现在,她想知道,一共有多少种花的方案。这里要注意的是,农场的种花的位置是不规则的。因此我们给出一对一对的相邻的位置的关系。

    Input 
    第一行两个数 N 和 M,表示种花的位置的个数和相邻的位置的对数 
    接下来 M 行,每行一组数 A, B 表示 A, B 相邻

    Output 
    一个数表示染色方法数

    Sample Input 
    5 4 
    1 2 
    1 3 
    1 4 
    1 5

    Sample Output 
    324 
    Hint 
    N<=10,M<=50

    大致思路:

    比赛一开始将模型建错,导致WA了整场。 
    之后才知道这个题的解法是把每一种可能的情况都试出来,并且对于数据很大的情况下没有优化的方法。 
    整个算法执行的过程类似于DFS,先给一个点随便选一个颜色,然后从这个点相邻的点分别染色,染色的过程中保证合法。若所有可能情况都试过且都不合法,则回溯到上一个点。

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=15;
     4 int n,m,mp[maxn][maxn],color[maxn];
     5 bool isame(int k)//判断染色是否合法
     6 {
     7     for(int i=1;i<=n;++i)
     8         if(mp[i][k]==1&&color[i]==color[k])
     9             return false;
    10     return true;
    11 }
    12 int gcolor()
    13 {
    14     memset(color,0,sizeof(color));
    15     int cnt=0,k=1;
    16     while(k>=1)//当k<0的时候就代表所有情况都已经尝试过,因为已经在第一个点的时候执行了回溯
    17     {
    18         color[k]++;//试颜色
    19         while(color[k]<=4)//保证染色的颜色合法
    20         {
    21             if(isame(k))
    22                 break;
    23             color[k]++;
    24         }
    25         if(k==n&&color[k]<=4)//所有点都染好色
    26             cnt++;
    27         else if(k<n&&color[k]<=4)//前k个点已经染好色,继续染下一个点
    28             k++;
    29         else{//可能的情况都不存在,回溯到上一个点
    30             color[k]=0;
    31             k--;
    32         }
    33     }
    34     return cnt;
    35 }
    36 int main()
    37 {
    38     ios::sync_with_stdio(false);
    39     //freopen("in.txt","r",stdin);
    40     int a,b;
    41     memset(mp,0,sizeof(mp));
    42     cin>>n>>m;
    43     for(int i=0;i<m;++i){
    44         cin>>a>>b;
    45         mp[b][a]=mp[a][b]=1;//建图
    46     }
    47     cout<<gcolor()<<endl;
    48     return 0;
    49 }
  • 相关阅读:
    Windows2008R2安装DNS和SQLServer200r2服务 (9.18第七天)
    Windows2008R2安装iis和iis下搭建web服务器(9.18 第七天)
    Ubuntu 安装phpmyadmin (9.17第六天)
    Ubuntu Navicat链接mysql (9.17第六天)
    Spring之AOP由浅入深
    oracle并行模式(Parallel)
    转:Java后端面试自我学习
    Spring Security 简介
    spring boot入门
    git--分布式版本管理系统
  • 原文地址:https://www.cnblogs.com/SCaryon/p/7375055.html
Copyright © 2020-2023  润新知