比赛 |
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;
}