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是谁呢

猜你喜欢

转载自www.cnblogs.com/DK-F/p/9436933.html
今日推荐