题目描述
赤壁之战,黄盖率舰满载薪草膏油诈降曹军。
受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船。每艘船都有其一定的战略价值。
为了保证达到破坏效果,黄盖需要保证被点燃的曹军船只两两之间都有铁索连接。他希望找到一种方案点燃总价值尽可能大的战船。
输入输出格式
输入格式:
第一行包含数字 N; M ,表示战船的数量和铁索的数量。
接下来包含 N 行,每 i 行包含 1 个数字 Vi ,表示第 i 艘战船的战略价值。
接下来包含 M 行,每 i 行包含 2 个数字 Si; Ti ,表示铁索连接的两艘船只。
数据保证这是一个可行的舰队安排。
输出格式:
输出一个数字,表示最多摧毁总价值多少的战船。
输入输出样例
说明
【数据规模】
对于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; }