poj-2531

 1 #include"iostream"
 2 #include"cstring"
 3 using namespace std;
 4 #define MAXN 20+5
 5 int C[MAXN][MAXN];
 6 int vis[MAXN];
 7 int N;
 8 int ans;
 9 void dfs(int id,int data){
10     vis[id]=1;
11     int tmp=data;
12     for(int i=1;i<=N;i++){
13         if(vis[i]==0)
14             tmp+=C[i][id];
15         else
16             tmp-=C[i][id];
17     }
18     if(ans<tmp)
19         ans=tmp;
20     for(int i=id+1;i<=N;i++){
21         if(tmp>data){
22             dfs(i,tmp);
23             vis[i]=0;
24         }
25     }
26 }
27 int main(){
28     cin>>N;
29     for(int i=1;i<=N;i++)
30         for(int j=1;j<=N;j++)
31             cin>>C[i][j];
32     memset(vis,0,sizeof(vis));
33     ans=0;
34     dfs(1,0);
35     cout<<ans<<endl;
36     return 0;
37
38 }
时间: 2024-10-11 02:57:47

poj-2531的相关文章

poj 2531 Network Saboteur 解题报告

题目链接:http://poj.org/problem?id=2531 题目意思:将 n 个点分成两个部分A和B(也就是两个子集啦), 使得子集和最大(一定很难理解吧,呵呵).举个例子吧,对于样例,最佳的分法就是把点2分为一个子集,另一个子集理所当然就是1.3了. 2-1 的权值是50,2-3的权值是40,那么最大就是50+40 = 90了. 首先dfs的话,我不太会做啦.看了队长的用了状态压缩来做,一下子觉得好神奇!!!! 可能第一次接触,理解得不是太深刻,先留着吧.就觉得好神奇,好神奇...

POJ 2531 Network Saboteur(dfs)

题目代号:POJ 2531 题目链接:http://poj.org/problem?id=2531 Language: Default Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13290   Accepted: 6428 Description A university network is composed of N computers. System administrator

poj 2531 -- Network Saboteur

Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9183   Accepted: 4313 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully di

poj 2531 搜索剪枝

Network Saboteur Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description A university network is composed of N computers. System administrators gathered informat

【POJ 2531】Network Saboteur

[POJ 2531]Network Saboteur 图的搜索 剪枝真是门学问..剪好了快的可真不是一倍两倍 刚开始搜的思路有问题 TLE了 后来枚举点暴力搜了一发 两百多ms 由于查找时权值是不断增加的 所以直接找集合间最大权的话不方便设置return点 看disscuss发现有一大牛 建了两个数组 通过所有边权-两集合内部边权(去重) 得到答案 dfs的时候找最小内部边权即可 当前状态权值>当前最小内部边权时直接跳出 两个数组分别寸当前状态两个集合中所含的点 每加一个点分别往两边加 假设要将

POJ 2531 暴力深搜

Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13494   Accepted: 6543 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully d

DFS/POJ 2531 Network Saboteur

1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int n,ans; 5 int a[30][30],f[30]; 6 int cmax(int a,int b){return a>b?a:b;} 7 void dfs(int x,int now) 8 { 9 if (x>n) 10 { 11 ans=cmax(ans,now); 12 return; 13 } 14 int temp=0;

poj 2531 Network Saboteur (dfs)

Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9364   Accepted: 4417 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully di

(搜索) poj 2531

Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9531   Accepted: 4533 Description A university network is composed of N computers. System administrators gathered information on the traffic between nodes, and carefully di

poj 2531 分权问题 dfs算法

题意:一个集合(矩阵) m[i][j]=m[j][i]权值,分成两个集合,使其权值最大.注:在同一个集合中权值只能算一个. 思路:dfs 假设都在集合0 遍历 id 的时候拿到集合1 如果与 id 相关的在集合 0 整体权值要加 否则整体权值要减 如果拿到集合 1 权值变大了,继续向后dfs,然后接着一个回溯的操作 代码上需要注意的问题: for (int i = id + 1; i < n; i++) { if (tmp > data) { dfs(i, tmp); dep[i] = 0;