您的位置:首页 > 其它

POJ 2531

2014-04-30 18:38 246 查看
思路:通过位运算来枚举集合,由于集合的互补性只需要枚举2^(n-1)个集合。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[30][30];
int main(){
int N, temp, flow, ans;
//freopen("in.c", "r", stdin);
while(~scanf("%d", &N)){
for(int i = 1;i <= N;i ++){
for(int j = 1;j <= N;j ++)
scanf("%d", &map[i][j]);
}
ans = -1;
for(int i = 1;i <= (1 << N-1);i ++){
flow = 0;
for(int j = 0;j <= 19;j ++){
if(i & (1 << j)){
for(int k = 0;k <= 20;k ++){
if(!(i & (1 << k))) flow += map[j+1][k+1];
}
}
}
ans = max(ans, flow);
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: