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 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16265822.html