zoukankan      html  css  js  c++  java
  • poj2531 Network Saboteur DFS枚举剪枝

    http://poj.org/problem?id=2531

    刚开始题意理解错了,看题解也没看懂。

    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). 

    这句话很关键。

    题意:给你N个节点,把这N个节点放入A、B两个集合,使得距离最大。计算方法:对于A的每一个节点,与B的距离。求此最大值。

    注意:题目给的矩阵,第ij表示第i个节点和第j个节点的距离。刚开始以为矩阵是节点,好菜!!!

    思路:首先假设所有所有节点都在集合0,然后依次枚举每个节点在集合1,不断更新取最大值,注意剪枝条件:当前的值<已经的得到的最大值。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int dep[25],a[25][25];
     7 int n,ans;
     8 void dfs(int id,int z)
     9 {
    10     dep[id]=1;              //将此节点放于B 
    11     int temp=z;
    12     for(int i=1;i<=n;i++)
    13     {
    14         if(dep[i]==0)
    15         temp+=a[i][id];       
    16         else
    17         temp-=a[i][id];     //将此节点从A移到B 
    18     }
    19     if(ans<temp)      //记录最大值 
    20     ans=temp;
    21     for(int i=id+1;i<=n;i++)
    22     {
    23         if(z<temp)   //剪枝,当前值小于已经取得的最大值 
    24         {
    25             dfs(i,temp);
    26             dep[i]=0;     //回溯 
    27         }
    28     }
    29 }
    30 main()
    31 {
    32     while(~scanf("%d",&n))
    33     {
    34         for(int i=1;i<=n;i++)
    35         for(int j=1;j<=n;j++)
    36         scanf("%d",&a[i][j]);
    37         ans=0;
    38         memset(dep,0,sizeof(dep));
    39         dfs(1,0);
    40         printf("%d
    ",ans);
    41     }
    42 }
  • 相关阅读:
    一个分页的存储过程
    自己动手:修改crx文件制作自己的Chrome Apps
    SQLSERVER 过滤所有权的代码
    在ASP.NET中实现多文件上传
    引用 TimeSpan简介
    xml
    常用的正则表达式小结
    ASP.NET事务处理
    创建可在网页下载安装的ActiveX控件(通过Setup.exe安装)
    ASP.NET验证控件应用实例与详解
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5730018.html
Copyright © 2011-2022 走看看