震惊!竟然就是个爆搜……
爆搜每条边上选哪个点,如果最后还没选满
K
K
<script type="math/tex" id="MathJax-Element-10">K</script>个,就挑没选过的点里大的选。
代码有点丑。。
#include <bits/stdc++.h>
using namespace std;
const int N=51;
const int M=N*N;
int n,m,a[N],b[N],K,num[N];
int u[M],v[M];
int ans,s;
class MagicMoleculeEasy {
public:
int maxMagicPower( vector <int> magicPower, vector <string> magicBond, int k );
};
int pd(int x){
for(int i=x;i<=m;i++)
if (b[u[i]]==0&&b[v[i]]==0) return 0;
return 1;
}
void dfs(int x,int k){
if (k>K) return;
if (x>m||k==K){
if (k<K){
int s0=s;
for(int i=1;i<=n;i++)
if (b[num[i]]==0){
s+=a[num[i]];
k++;
if (k==K) break;
}
if (k==K) ans=max(ans,s);
s=s0;
return;
}
if (pd(x)) ans=max(ans,s);
return;
}
while((b[u[x]]||b[v[x]])&&x<=m) x++;
if (x>m){ dfs(x,k);return; }
int s0=s;
b[v[x]]=1;s+=a[v[x]];
dfs(x+1,k+1);
b[u[x]]=1;s+=a[u[x]];
dfs(x+1,k+2);
b[v[x]]=0;s=s0+a[u[x]];
dfs(x+1,k+1);
b[u[x]]=0;s=s0;
}
int cmp(const int &q,const int &w){
return a[q]>a[w];
}
int MagicMoleculeEasy::maxMagicPower(vector <int> c, vector <string> map, int k) {
n=c.size();K=k;
if (k>n) return -1;
for(int i=0;i<n;i++) a[i+1]=c[i],num[i+1]=i+1;
sort(num+1,num+1+n,cmp);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if (map[i][j]=='Y') u[++m]=i+1,v[m]=j+1;
ans=-1;
dfs(1,0);
return ans;
}