• 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 }
  • 相关阅读:
    centos7.6系统搭建ibm mq
    eureka服务如何下线及启动
    linux系统遇见挖矿如何处理
    Ceph剖析:数据分布之CRUSH算法与一致性Hash
    makefile 书写方法
    ceph 相关blog
    RabbitMQ 之 安装
    BaGet:搭建 Nuget 私服
    RabbitMQ 简介及其安装
    Redis 简介
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5730018.html
Copyright © 2020-2023  润新知