题目走起GO,GO,GO-->
【题目描述】
附中的网络一共由N台终端计算机构成。系统管理员掌握了每两个节点之间的流量,并且将整个网络分成两个子网,使得两个子网之间产生的流量尽可能小。
LQX来到信息社的一年多来专注于黑客技术的研究,现在他入侵了管理系统,掌握了系统管理员的所有信息,并且想重新划分两个子网,使得子网之间的流量尽可能大,从而搞崩整个网络系统。但是如果有人可以提前计算出LQX的方案,LQX的破坏计划就会被暴露,从而遭到高老师的惩罚。
流量数据用C矩阵表示,Cij表示i节点和j节点之间的流(Cij=Cji,Cii=0)。LQX的目标是将整个网络划分为A和B两个子网,使得所有Cij的和最大(i属于A网络,j属于B网络)。
【输入】
输入第一行为一个整数N(2<=N<=20)。在接下来N行,包括N个用空格隔开的数字,表示流量矩阵 C(0<=Cij<=10000)。
【输出】
输出为一个整数,表示两个子网间的最大流量。
【输入示例】
3
0 50 30
50 0 40
30 40 0
【输出示例】
90
咳咳咳,DK声明一下,这道题是我们老师魔改过的,不要在意细节,题目主体没有变哦。
首先,这道题是深搜!深搜!深搜!哈哈哈!我最喜欢深搜了!
咳咳,有点OOC,我们继续。
这道题的深搜思路是这样滴
元素---》分到A或B--》记录节点流量--》下一个元素--》……--》元素分完了,回溯。
代码出场————dalala~~~
1 #include<iostream> 2 using namespace std; 3 int net[23][23]; 4 int num; 5 int max1=0; 6 int a1[23]; 7 int a2[23]; 8 int ai=0,aj=0; 9 void part(int x,int ans) 10 { 11 if(x>num) 12 { 13 if(ans>max1) 14 { 15 max1=ans; 16 } 17 return; 18 } 19 a1[ai]=x; 20 ai++; 21 int k=0; 22 for(int i=0;i<=aj;i++) 23 { 24 k=k+net[x][a2[i]]; 25 } 26 part(x+1,ans+k); 27 ai--; 28 a1[ai]=0; 29 a2[aj]=x; 30 aj++; 31 k=0; 32 for(int i=0;i<=ai;i++) 33 { 34 k=k+net[x][a1[i]]; 35 } 36 part(x+1,ans+k); 37 aj--; 38 a2[aj]=0; 39 return; 40 } 41 int main() 42 { 43 cin>>num; 44 for(int i=1;i<=num;i++) 45 { 46 for(int j=1;j<=num;j++) 47 { 48 cin>>net[i][j]; 49 } 50 } 51 part(1,0); 52 cout<<max1; 53 }
完成,一道深搜就这样出来了。
我才不会告诉你们LQX是谁呢