C——Network Saboteur (POJ2531)

來源:互聯網
上載者:User

標籤:理解   format   decided   maximum   string   ...   traffic   div   after   

題目:A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully divided the network into two subnetworks in order to minimize traffic between parts. 
A disgruntled computer science student Vasya, after being expelled from the university, decided to have his revenge. He hacked into the university network and decided to reassign computers to maximize the traffic between two subnetworks. 
Unfortunately, he found that calculating such worst subdivision is one of those problems he, being a student, failed to solve. So he asks you, a more successful CS student, to help him. 
The traffic data are given in the form of matrix C, where Cij is the amount of data sent between ith and jth nodes (Cij = Cji, Cii = 0). The goal is to divide the network nodes into the two disjointed subsets A and B so as to maximize the sum ∑Cij (i∈A,j∈B).

Input

The first line of input contains a number of nodes N (2 <= N <= 20). The following N lines, containing N space-separated integers each, represent the traffic matrix C (0 <= Cij <= 10000). 
Output file must contain a single integer -- the maximum traffic between the subnetworks. 

Output

Output must contain a single integer -- the maximum traffic between the subnetworks.

Sample Input

30 50 3050 0 4030 40 0

Sample Output

90

解題思路:
首先這個題目的題意就比較難理解。題目大意:有n個點,每兩個點之間都有一段距離,現在要把這些點分為兩部分,使得一個部分的點到另一個部分所有的點的距離和最大。(學過離散的就知道這是一個完全圖)比如題中的例子:就是一個K3圖(3個頂點的完全圖,一個三角形),設頂點為A,B,C.由題意可知:A到B的距離為30,B到C為40,C到A為50.當把A放一邊,B,C放一邊時,總距離為:A到B的距離(30)+A到C的距離(50)=80.當把C放一邊,A,B一邊時,總距離為AC+BC=90,另一種為30+40=70.所以最大的距離和為90.
看懂題目的可能都知道要用枚舉來找最大距離和,但是怎麼枚舉呢?用for迴圈?肯定行不通的。這裡就用”二進位枚舉“來枚舉所有情況並找到最大值。

二進位枚舉(非遞迴):
用數組的值為0或1來把所有的點來分為兩部分。
 1 int a[10002]; 2 memset(a,0,sizeof(a)); //清零。 3 for (int i=0;i<n;i++) //n:枚舉的次數。 4 { 5   a[0]++;     //第一位加一。 6  for (int j=0;j<n;j++) 7    if (a[j]==2)   8      { 9        a[j]=0;   //當這一位等於2時,又清零10        a[j+1]++;  //並使下一位加一。11      }12 }

代碼可能不好理解。下面類比過程。
開始時的數組: 00000
a[0]++;後 10000
a[0]++等於2後,a[0]=0;a[0+1]++;01000
接下來是:
11000
00100
10100
01100
......
11111
這樣就把所有的情況都枚舉出來了。
下一步就只要把所有枚舉中0或1的所有對應值求和,並找到最大值就可以了。
全部代碼如下:
#include <iostream>#include <cstring>#include <cmath>using namespace std;int a[22][22],tab[22];int main(){    int n,i,j,k,ans=0,sum=0,z;    cin >>n;    for (i=1;i<=n;i++)        for (j=1;j<=n;j++)        cin >>a[i][j];        k=pow(2,n-1);   //枚舉的情況總數。    for (i=1;i<=k;i++)    {        tab[1]++;        sum=0;        for (j=1;j<=n;j++)            if (tab[j]==2)        {           tab[j]=0;           tab[j+1]++;        }        else break;        for (j=1;j<=n;j++)        {            if (tab[j]==0)continue;  //找到每一個為1的點。            for (z=1;z<=n;z++)                    if (tab[z]==0)           //並把這個1到所有0的距離求和。                sum+=a[j][z];        }        ans=max(ans,sum);    //找到最大的的和。    }    cout <<ans<<endl;    return 0;}

 





C——Network Saboteur (POJ2531)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.