YunYan

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

题目链接:https://codeforces.com/contest/1230/problem/C

题目大意:21枚多米诺牌,给你一个图,将多米诺牌放到图的边上,由同一个点发出的所有边,边上多米诺牌对应该点的一侧相同。

such as:

 

题解:暴力枚举,即先给每个点一个值,然后判断在这种情况下可以放置多少个多米诺牌,枚举的时候可以dfs递归

#include<bits/stdc++.h>
using namespace std;
const int N=200;
int n,m;
int d[N];
int l[N],r[N];
int ans=0;
bool mark[N][N];
void check(){
    int sum=0;
    memset(mark,0,sizeof(mark));
    for(int i=1;i<=m;i++){
        int a=d[l[i]];
        int b=d[r[i]]; 
        if(a>b) swap(a,b);
        
        if(!mark[a][b]){//判断a,b这种牌有没有被用过; 
            mark[a][b]=1;
            sum++;
        }
    }
    ans=max(ans,sum);
}
void dfs(int x){
    if(x==n+1){//如果所有的点都被赋值,那就判断在这种情况下可以多少放置多少个; 
        check();
        return ;
    }
    for(int i=1;i<=6;i++){
        d[x]=i;
        dfs(x+1);
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&l[i],&r[i]); //指的是从l到r有一条边 
    }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}

 

posted on 2019-09-26 15:43  Target--fly  阅读(131)  评论(0编辑  收藏  举报