C/C++教程

m着色(回溯法)C/C++

本文主要是介绍m着色(回溯法)C/C++,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

时间限制: 1 Sec 内存限制: 128 MB

题目描述
魔法宫殿的最深处藏着一把万能权杖,为这个国家提供了强大的军事力量,然而有天却被一个等级略低的小法师误用,导致强大的法术失控,并形成了一个怪异的法阵保护着法杖。国家少了一件圣器,在战火纷飞的年代国力也逐渐衰退,历代国王们不惜一切代价和奖赏,吸引人们来破解法阵,可惜百年来无人能破。现在你穿越来到了宫殿,这个法阵就摆在你面前,它由许多魔法球连接而成,你可以看成一张联通的无向图,由于这个世界的元素是平衡的,相邻的魔法球如果具有相同的元素,就会发出元素之力伤害周围的人,当然,问题还不止这么简单,你不仅仅要使相邻魔法球之间的元素互不相同,还得知道对于K种元素,有多少种方案可以满足这个条件,听完国王的描述,你一言不发,掏出笔记本,打开编译器……

输入
第一行输入三个正整数N, M, K(N <= 50, M <= 1000, 2<=K <= 4),分别表示点的个数,边的个数,元素数量,第2行到第1 + M行,每行两个正整数U, V(U <= N, V <= N且U != V), 表示U到V有一条双向边,图保证联通。

输出
一个整数,表示用最多K种元素赋予魔法球的方案数,答案对1e9 + 7取模

样例输入
4 5 4
1 4
1 2
1 3
3 4
3 2
样例输出
48

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll mod=1e9+7;
ll n,m,k;
ll a[100][100];
ll sum=0,v[100];
int ok(int kx,int col){
    for(int i=1;i<=n;i++){
        if(a[kx][i]&&(col==v[i]))return 0;
    }
    return 1;
}
void dfs(int x){
    if(x>n){
        sum++;
        sum%=mod;
        return ;
    }
    for(int i=1;i<=k;i++){

        if(!ok(x,i)){
            continue;
        }
        v[x]=i;
        dfs(x+1);
        v[x]=0;
    }
    return ;
}
int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        a[x][y]=1;
        a[y][x]=1;
    }
    dfs(1);
    sum%=mod;
    cout<<sum;
	return 0;
}


这篇关于m着色(回溯法)C/C++的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!