题解 CF102A 【Clothes】

本萌新来介绍一种\(dfs\)思路:

  • 1 如果件数已经$=$3,那么判断,如果符合条件,则更新答案

  • 2 如果件数$<$3,那么枚举\(1\)~\(n\),如果该件衣服没被取过,则标记为已取并\(dfs\)下一件

Code

#include<bits/stdc++.h>
using namespace std;
    int n,m,money[110],minx=INT_MAX;
bool p[110][110],f,use[110];
int s[5];
bool comp()//判断是否符合条件
{
    if(p[s[1]][s[2]] and p[s[1]][s[3]] and p[s[2]][s[3]]) return 1;
    return 0;
}
void dfs(int t,int sum)
{
    if(t>3)//件数>3判断
    {
        if(comp())
        {
            f=1;//标记为有方案
            minx=min(minx,sum);
        }
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!use[i])//该件衣服没被取过
        {
            s[t]=i;//保存答案编号用于之后判断
            use[i]=1;//标记为已取
            dfs(t+1,sum+money[i]);
            use[i]=0;//回溯
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>money[i];
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        p[x][y]=1;//建有向图
        p[y][x]=1;
    }
    dfs(1,0);
    if(f) cout<<minx;
    else cout<<"-1";
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/WKAHPM/p/11628908.html