zoukankan      html  css  js  c++  java
  • poj 2531 Network Saboteur(搜索)

    题意:给矩阵,ij表示i-j的距离是c,现问0-n个点怎么分配到两个集合中使A集合到B集合的总距离最大

    分析,搜索DFS

    #include<stdio.h>
    #include<string.h>
    const int MAXN=30;
    int map[MAXN][MAXN];
    int n,ans;
    int vis[MAXN];
    void DFS(int cur)//搜n次,挨个点枚举
    {
        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()
    {
        int T,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                     scanf("%d",&map[i][j]);
                }
            }
            memset(vis,0,sizeof(vis));
            ans=0;
            DFS(0);
            printf("%d\n",ans);
        }
        return 0;
    }
    #include<stdio.h>
    #include<string.h>
    const int MAXN=30;
    int map[MAXN][MAXN];
    int vis[MAXN];
    int n;
    int ans;
    int total;
    
    void DFS(int cur)//已点进入A或B集合进行搜索
    {
        int i;
        if(cur==n)
        {
            if(ans<total)
            {
                ans=total;
            }
            return ;
        }
        int sum=0;
        for(i=0;i<cur;i++)//当cur在false集合中
        {
            if(vis[i]==true)
            {
                sum+=map[cur][i];
            }
        }
        total+=sum;
        DFS(cur+1);
        total-=sum;
        vis[cur]=true;
        sum=0;
        for(i=0;i<cur;i++)//当cur在true集合中
        {
            if(vis[i]==false)
            {
                sum+=map[cur][i];
            }
        }
        total+=sum;
        DFS(cur+1);
        vis[cur]=false;
        total-=sum;
    }
    
    int main()
    {
        int i,j;
        while(scanf("%d",&n)!=EOF)
        {
            ans=0;
            total=0;
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    scanf("%d",&map[i][j]);
                }
            }
            memset(vis,0,sizeof(vis));
            DFS(0);
            printf("%d\n",ans);
        }
        return 0;
    }
  • 相关阅读:
    ElasticSearch 概念解析
    CSS Selector (part 1)
    ruby 把字符串转为正则匹配表达式
    SQL ISNULL应用
    logstash input jdbc连接数据库
    Logstash add_field 参数应用
    函数返回局部变量/局部指针
    内存四区模型
    释放内存触发断点及数组、指针的NULL初始化
    动态分配内存
  • 原文地址:https://www.cnblogs.com/zsboy/p/2910252.html
Copyright © 2011-2022 走看看