POJ2531-Network Saboteur
题目走起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是谁呢
在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹。