bzoj 1040 骑士

题目大意:

每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己)和他自己的战斗力

从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况)

并且,使得这支骑士军团最具有战斗力

思路:

又题目可知

把图连出来之后是一些树上带一个或不带环

对于没有环的直接像上司的舞会一样dp即可

对于有环的把环拆开

把分裂的点 分别做为根 另一个定为不能取 dp两次

最后把每个(环套)树的答案相加即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 1001001
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
19     return x*f;
20 }
21 int n,fst[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt;
22 int val[MAXN],vis[MAXN],t1,t2,ok[MAXN<<1],ban;
23 ll dp[MAXN][2],res,ans;
24 void add(int u,int v) {nxt[cnt]=fst[u],fst[u]=cnt,to[cnt++]=v;}
25 void dfs(int x,int fa)
26 {
27     vis[x]=1;
28     for(int i=fst[x];i!=-1;i=nxt[i])
29     {
30         if(to[i]==fa) continue;
31         if(vis[to[i]])
32         {
33             t1=x,t2=to[i],ok[i]=ok[i^1]=1;
34             return ;
35         }
36         dfs(to[i],x);
37     }
38 }
39 void Dp(int x,int fa)
40 {
41     vis[x]=1;
42     if(x==ban) dp[x][1]=0;
43     else dp[x][1]=val[x];
44     dp[x][0]=0;
45     for(int i=fst[x];i!=-1;i=nxt[i])
46         if(to[i]!=fa&&!ok[i])
47         {
48             Dp(to[i],x);
49             dp[x][1]+=dp[to[i]][0],dp[x][0]+=max(dp[to[i]][1],dp[to[i]][0]);
50         }
51 }
52 int main()
53 {
54     memset(fst,0xff,sizeof(fst));
55     n=read();int a;
56     for(int i=1;i<=n;i++) {val[i]=read(),a=read();add(i,a);add(a,i);}
57     for(int i=1;i<=n;i++)
58         if(!vis[i]) 
59         {
60             t1=t2=res=0;
61             dfs(i,0);
62             ban=t2;Dp(t1,0);
63             res=max(dp[t1][0],dp[t1][1]);
64             ban=t1;Dp(t2,0);
65             ans+=max(res,max(dp[t2][0],dp[t2][1]));
66         }
67     printf("%lld",ans);
68 }
View Code

 

转载于:https://www.cnblogs.com/yyc-jack-0920/p/8401257.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值