题意:
求两个子图的最大的割边的和
思路:
DFS&枚举
把图上的点先全部分给0集合。然后取枚举哪几个是1集合的,去求最大的割边的和
CODE 47ms
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int mp[35][35];
int vis[35];
int n,ans;
void dfs(int id, int data)
{
int tmp = data;
vis[id] = 1;///把它归为1的集合
for(int i = 1; i <= n;i++)///割边更新
{
if(!vis[i])
tmp += mp[i][id];
else
tmp -= mp[i][id];
}
if(ans < tmp)///更新最大割边
ans = tmp;
for(int i = id+1; i <= n; i++)
{
if(tmp>data)///当小于当前的话,不会继续,剪枝
{
dfs(i,tmp);
}
}
vis[id] = 0;
}
int main()
{
while(~scanf("%d",&n))
{
int i, j;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
scanf("%d",&mp[i][j]);
ans = 0;
memset(vis,0,sizeof(vis));///初始化的,把所有的点归为0的集合
dfs(1,0);
printf("%d\n",ans);
}
return 0;
}