P2128 赤壁之战
题目描述
赤壁之战,黄盖率舰满载薪草膏油诈降曹军。
受庞统所授的连环计,曹军战船之间由铁索相连,没有两艘战船在同一位置,也没有铁索两两相交或穿过战船。每艘船都有其一定的战略价值。
为了保证达到破坏效果,黄盖需要保证被点燃的曹军船只两两之间都有铁索连接。他希望找到一种方案点燃总价值尽可能大的战船。
输入输出格式
输入格式:
第一行包含数字 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 N 5010 using namespace std; bool vis[N]; int n,m,x,y,ans,sum,v[N],q[100010],edge[N][N]; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int pd(int x) { for(int i=1;i<=sum;i++) if(!edge[x][q[i]]) return 0; return 1; } int dfs(int x,int s) { if(s>ans) ans=s; for(int i=1;i<=n;i++) if(!vis[i]&&pd(i)||x==1) { vis[i]=true; q[++sum]=i; dfs(x+1,s+v[i]); vis[i]=false; sum--; } } int main() { n=read(),m=read(); for(int i=1;i<=n;i++) v[i]=read(); for(int i=1;i<=m;i++) { x=read(),y=read(); edge[x][y]=1; edge[y][x]=1; } dfs(1,0); printf("%d",ans); return 0; }