PKU 2531 Network Saboteur
http://poj.org/problem?id=2531
n(<=20)この頂点をもつ完全グラフが与えられる。
ここでノードi,j間のコストをCijとするときに、グラフを2つの頂点集合A,Bに分割し
��Cij (i∈A,j∈B)を最大化しろというような問題
全探索。
愚直すぎると通らないようなので、少しだけ高速化しました。
差分計算とかまで考えなくて済んだので、よかったです。
int in[20][20]; int ans; int n; int g1[20],g2[20]; int g1s,g2s; void dfs(int v){ if(v==n){ int tans=0; rep(i,g1s)rep(j,g2s) tans+=in[g1[i]][g2[j]]; ans=max(ans,tans); return; } g1[g1s++]=v; dfs(v+1); g1s--; g2[g2s++]=v; dfs(v+1); g2s--; } main(){ cin>>n; rep(i,n)rep(j,n)scanf("%d",in[i]+j); dfs(0); cout<<ans<<endl; }