比赛 NOIP2023模拟赛3 评测结果 AATTTTEEEE
题目名称 旅游网络 最终得分 20
用户昵称 宇战 运行时间 32.726 s
代码语言 C++ 内存使用 16.83 MiB
提交时间 2023-11-15 11:22:04
显示代码纯文本
#include<bits/stdc++.h>
    using namespace std;
    const int N=2000,M=2600;
    int n,m,ans=0x3f3f3f3f;
    int tot,ver[M],head[M],Next[M],a[N],v[N],f[N][N];
    void add(int x,int y){
        ver[++tot]=y;
        Next[tot]=head[x];
        head[x]=tot;
    }
    bool check(){
        int top=0;
        for(int i=1;i<=n;i++){
            if(v[i]==1){
                top++;
            }else{
                for(int j=1;j<=f[i][0];j++){
                    if(v[f[i][j]]==1){
                        top++;
                        break;
                    }
                }
            }
        }
        if(top==n){
            return true;
        }else{
            return false;
        }
    }
    void dfs(int x,int st){
        if(check()){
            ans=min(ans,st);
            return;
        }
        if(x>n){
            return;
        }
        if(st>ans){
            return;
        }
        int fl=0;
        if(v[x]==0){
            for(int i=1;i<=f[x][0];i++){
                if(v[f[x][i]]==1){
                    fl=1;
                    break;
                }
            }
            if(fl==0){
                v[x]=1;
            dfs(x+1,st+a[x]);
            v[x]=0;
            }
        }
        dfs(x+1,st);
    }
    int main(){
        freopen("cogito.in","r",stdin);
        freopen("cogito.out","w",stdout);
          cin>>n>>m;
          for(int i=1;i<=n;i++){
              cin>>a[i];
          }             
          for(int i=1;i<=m;i++){
              int x,y;
              cin>>x>>y;
              add(x,y);
              add(y,x);
              f[x][++f[x][0]]=y;
              f[y][++f[y][0]]=x;
          }      
          dfs(1,0);
          cout<<ans; 
    }