poj 2531 Network Saboteur

题目链接:http://poj.org/problem?id=2531

不太好读题,

首先应该先明白题目说的三个子网到底是什么,

 

 应该是这种:

并且要求子网之间的最大流量,那就是把子网2做中继点,对1,2进行流通,得到的流量是50+40=map[1][2]+map[3][2];

这道题的数据实际上给的很宽泛,小于等于20,如果要是更大的数据就要用最大割算法,当然这里暴力搜索就可以了;

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<cmath>
 6 int map[50][50];
 7 int vis[50];
 8 int n;
 9 int ans=INT_MIN;
10 void dfs(int sets,int sum)
11 {
12     vis[sets]=1;
13     int temp=sum;
14     for(register int i=0;i<n;i++)
15     {
16         if(vis[i])//同一子网的需要减去重复值
17         {
18             temp-=map[sets][i];
19         }
20         else//不同的需要加权
21         temp+=map[sets][i];
22     }
23     ans=ans>temp?ans:temp;//求最大值
24     for(register int i=sets+1;i<n;i++)
25     {
26         if(temp>sum)//如果比当前总和要大
27         {
28             dfs(i,temp);
29             vis[i]=0;//回溯
30         }
31     }
32 }
33 int main()
34 {
35     scanf("%d",&n);
36     for(register int i=0;i<n;i++)
37     {
38         for(register int j=0;j<n;j++)
39         {
40             scanf("%d",&map[i][j]);
41         }
42     }
43     dfs(0,0);
44     printf("%d\n",ans);
45 }

 

posted @ 2022-05-13 10:49  江上舟摇  阅读(15)  评论(0编辑  收藏  举报