POJ_2531

题目描述
这题主要题意难懂
题目大意:给定n个点并给出点与点之间的距离,请将点分为两个点集,使得两集合之间的距离最大
如:设点 i , j i,j i,j的距离为map[i][j]或者map[j][i]
1 , 2 , 3 1,2,3 123分为 1 , 2 { 1,2} 12 3 3 3距离为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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值