洛谷 P2128 赤壁之战

题目描述

赤壁之战,黄盖率舰满载薪草膏油诈降曹军。

受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船。每艘船都有其一定的战略价值。

为了保证达到破坏效果,黄盖需要保证被点燃的曹军船只两两之间都有铁索连接。他希望找到一种方案点燃总价值尽可能大的战船。

输入输出格式

输入格式:

 

第一行包含数字 N; M ,表示战船的数量和铁索的数量。

接下来包含 N 行,每 i 行包含 1 个数字 Vi ,表示第 i 艘战船的战略价值。

接下来包含 M 行,每 i 行包含 2 个数字 Si; Ti ,表示铁索连接的两艘船只。

数据保证这是一个可行的舰队安排。

 

输出格式:

 

输出一个数字,表示最多摧毁总价值多少的战船。

 

输入输出样例

输入样例#1: 复制
4 6
100
5000
1000
2000
1 2
1 3
1 4
2 3
2 4
3 4
输出样例#1: 复制
8100
输入样例#2: 复制
6 8
1500
1000
100
2000
500
300
1 2
1 3
1 4
2 4
3 5
4 5
4 6
5 6
输出样例#2: 复制
4500

说明

【数据规模】

对于50%的数据,保证 N,M ≤ 10。

对于100%数据,保证 N ≤ 450; M ≤ 900; Vi ≤ 6000。

【注意】

题目中的每句话(除了第一段)都有作用。

思路:搜索。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000
using namespace std;
int n,m,ans,tot;
int map[MAXN][MAXN];
int v[MAXN],num[MAXN],vis[MAXN];
void dfs(int sum,int pre){
    ans=max(ans,sum);
    for(int i=pre+1;i<=n;i++)
        if(!vis[i]){
            int sum1=0;
            for(int j=1;j<=tot;j++)
                if(map[i][num[j]])    sum1++;    
            if(sum1==tot){
                vis[i]=1;
                num[++tot]=i;
                dfs(sum+v[i],i);
                tot--;
                vis[i]=0;
            }
        }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)    scanf("%d",&v[i]);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        map[x][y]=map[y][x]=1;
    }
    dfs(0,0);
    cout<<ans;
}

 

posted @ 2017-12-30 07:57  一蓑烟雨任生平  阅读(320)  评论(0编辑  收藏  举报