POJ_2531

题目描述
这题主要题意难懂
题目大意:给定n个点并给出点与点之间的距离,请将点分为两个点集,使得两集合之间的距离最大
如:设点 i , j i,j 的距离为map[i][j]或者map[j][i]
1 2 3 1,2,3 分为 1 2 { 1,2} 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;
}
发布了7 篇原创文章 · 获赞 0 · 访问量 51

猜你喜欢

转载自blog.csdn.net/Doneoll/article/details/104430428
POJ