博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2531 Network Saboteur(经典dfs)
阅读量:5773 次
发布时间:2019-06-18

本文共 1386 字,大约阅读时间需要 4 分钟。

题目大意:有n个点,把这些点分别放到两个集合里,在两个集合的每个点之间都会有权值,求可能形成的最大权值。

 

思路:1、把这两个集合标记为0和1,先默认所有点都在集合0里。

            2、依次枚举每个点id,把每个点都放到集合1里去,这个时候就要调整集合的权值了,原来和id都在集合0里的点,要把权值加上;而在集合1里的点,要把权值减去。

            3、权值调整完毕后,和ans比较,如果比ans要大, 调整ans。

            4、如果放到集合1中,调整节点后的权值比放在集合0中要大,那么就默认这个点在集合1中,继续枚举下面的点进行DFS。最终是可以把最有状态都枚举出来的。

 

1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 using namespace std;16 #define PI acos(-1.0)17 #define max(a,b) (a) > (b) ? (a) : (b)18 #define min(a,b) (a) < (b) ? (a) : (b)19 #define ll long long20 #define eps 1e-1021 #define MOD 100000000722 #define N 2623 #define inf 1e1224 int n;25 int mp[N][N];26 int vis[N];27 int ans;28 void dfs(int id,int data){29 vis[id]=1;30 int tmp=data;31 for(int i=1;i<=n;i++){32 if(vis[i]==0){33 tmp+=mp[id][i];34 }else{35 tmp-=mp[id][i];36 }37 }38 ans=max(ans,tmp);39 for(int i=id+1;i<=n;i++){40 if(tmp>data){41 dfs(i,tmp);42 vis[i]=0;43 }44 }45 }46 int main()47 {48 while(scanf("%d",&n)==1){49 memset(vis,0,sizeof(vis));50 for(int i=1;i<=n;i++){51 for(int j=1;j<=n;j++){52 scanf("%d",&mp[i][j]);53 }54 }55 ans=-1;56 dfs(1,0);57 printf("%d\n",ans);58 }59 return 0;60 }
View Code

 

转载地址:http://nzaux.baihongyu.com/

你可能感兴趣的文章
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>
ORACLE配置,修改tnsnames.ora文件实例
查看>>
Workstation服务无法启动导致无法访问文件服务器
查看>>
Linux常用命令(一)
查看>>
一个自动布署.net网站的bat批处理实例
查看>>
我的友情链接
查看>>
Centos6.6安装选包及基础场景说明
查看>>
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
CString、Char* ,char [20]、wchar_t、unsigned short转化
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
excel进行矩阵计算
查看>>