题目描述
这题主要题意难懂
题目大意:给定n个点并给出点与点之间的距离,请将点分为两个点集,使得两集合之间的距离最大
如:设点
的距离为map[i][j]或者map[j][i]
点
分为
和
距离为map[1][3]+map[2][3];
转化为分堆问题 dfs解决
关键代码:计算距离和
for(i=0;i<n;i++) //计算距离和
{
if(vis[i])
{
for(j=0;j<n;j++)
{
if(!vis[j])
{
sum+=map[i][j];
}
}
}
}
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=30;
int map[MAXN][MAXN];
int n,ans;
int vis[MAXN];
void DFS(int cur)
{
int i,j;
int sum=0;
if(cur==n)
{
return ;
}
for(i=0;i<n;i++) //计算距离和
{
if(vis[i])
{
for(j=0;j<n;j++)
{
if(!vis[j])
{
sum+=map[i][j];
}
}
}
}
if(sum>ans) ans=sum;
vis[cur]=1;
DFS(cur+1);
vis[cur]=0;
DFS(cur+1);
}
int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>map[i][j];
}
}
memset(vis,0,sizeof(vis));
ans=0;
DFS(0);
cout<<ans<<endl;
}
return 0;
}