首页 > 其他分享 >[AHOI2014/JSOI2014]骑士游戏

[AHOI2014/JSOI2014]骑士游戏

时间:2022-12-14 20:55:05浏览次数:54  
标签:JSOI2014 int AHOI2014 long edge 骑士 data top dis

链接:https://www.luogu.com.cn/problem/P4042 题目描述:对于一个怪物$i$,可以花费$c_{i}$的代价将其变为一个怪物集合,或花费$c2_{i}$的代价消灭他。求消灭怪物$1$的最小代价。 题解:由于这里涉及到了变化的传递,我们可以将原问题抽象为一个图,每一个点它可以花费$c2_{i}$的代价到达一个死亡节点或花费$c_{i}$的代价到达一个点集。 由于这个点集无法被直接表示,那么我们可以将他化为求点集的最小消灭代价之和$+$$c_{i}$,直接消灭也就是可以将$i$的最小消灭代价化为$c2_{i}$。 我们可以将$dijkstra$稍微改改,将所有点的$dis$初始化为$c2_{i}$,每一次将转移变为求集的最小消灭代价之和$+$$c_{i}$,也像$dijkstra$那样跑就行了。 ``` #include #include #include using namespace std; struct node { long long v,nxt,data; bool vis; }; node edge[2000001]; struct reads { long long num,data; bool operator < (const reads &a)const { return data>a.data; } }; long long dis[200001],dis2[200001]; int len,head[200001],n,in[200001],cnt[200001]; bool used[200001]; priority_queueq; reads tmp; reads make_reads(int x,long long y) { tmp.num=x; tmp.data=y; return tmp; } void add(int x,int y,long long z) { edge[++len].v=y; edge[len].data=z; edge[len].nxt=head[x]; head[x]=len; return; } void dijkstra() { int top; while (!q.empty()) { top=q.top().num; q.pop(); if (used[top]) continue; used[top]=1; for (int i=head[top];i>0;i=edge[i].nxt) { if (!edge[i].vis&&cnt[edge[i].v]==in[edge[i].v]-1&&dis[edge[i].v]>dis2[edge[i].v]+dis[top]+edge[i].data) { edge[i].vis=1; cnt[edge[i].v]++; dis[edge[i].v]=dis2[edge[i].v]+dis[top]+edge[i].data; q.push(make_reads(edge[i].v,dis[edge[i].v])); } if (!edge[i].vis&&cnt[edge[i].v]<in[edge[i].v]-1) {="" edge[i].vis="1;" cnt[edge[i].v]++;="" dis2[edge[i].v]="dis2[edge[i].v]+dis[top];" }="" return;="" int="" main()="" long="" x,y,z,w;="" scanf("%lld",&n);="" for="" (int="" i="1;i<=n;++i)" scanf("%lld%lld%lld",&x,&y,&z);="" while="" (z--)="" cin="">>w; add(w,i,x); in[i]++; } dis[i]=y; } for (int i=1;i<=n;++i) q.push(make_reads(i,dis[i])); dijkstra(); printf("%lld\n",dis[1]); return 0; }

标签:JSOI2014,int,AHOI2014,long,edge,骑士,data,top,dis
From: https://www.cnblogs.com/zhouhuanyi/p/16983514.html

相关文章

  • 2199. 骑士共存问题
    题目链接2199.骑士共存问题在一个\(n*n\)个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘上某些方格设置了障碍,骑士不得进入。对于给定的\(n*n\)......
  • 骑士的移动(Knight Moves)
    ​​KnightMoves​​TimeLimit:3000MS MemoryLimit:Unknown 64bitIOFormat:%lld&%llu​​Submit ​​​​Status​​Description​​​​Afriendofyou......
  • 题解 LGP2607【[ZJOI2008] 骑士】
    problem基环树森林带权最大独立集。\(n\leq10^6\)。solution0这里先解释一下基环树森林,它就是一个\(n\)个点\(n\)条边的森林,同时是一个荒漠。我们拿出其中一棵连......
  • 骑士游历问题(马踏棋盘)解析(c++)
    骑士游历问题:在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径解题思路:这是一道经典的遍历问题(DFS),由于题目要求遍历全部,那......
  • [ZJOI2008]骑士
    P2607基环树板子题(虽然打了好久好久)题目大意是给你一n个人的能力值,在每个人都有一个死敌不能同时被选中的情况下,从中挑出一些人,问能力值最大是多少。首先,为什么会往基......
  • 【SCOI2005】骑士精神(IDA_,A_)
    我们先考虑最纯粹的暴力,也就是暴力枚举每次空格调到哪里,并继续递归求解。然后发现\(O(8^{15}\times5\times5)\)的复杂度限制了我们的想象。同学写了一发好像10分然后既......
  • P2607 [ZJOI2008] 骑士
    #include<bits/stdc++.h>//#include<windows.h>usingnamespacestd;#definelllonglongconstintN=1e6+1;intn;inth[N],nt[N*2],to[N*2];intcnt;voidadd(i......
  • [SCOI2005] 骑士精神 题解
    题目描述解法采用IDA*算法。不移动骑士而移动空格。每次限制深度,然后对每个遍历到的点进行一次估价,估价函数的值即为当前状态和终点的差异数。如果估计的加上已经确......
  • 卸载阿里云云盾(安骑士)(Agent)
    前言一直在使用阿里云ECS服务器,但是最近一年,多个服务器都遇到过突然连不上的情况,服务器跑的跑的服务都是已知的。但是在某个时间,实例云盘却出现了每秒一百多M的读写(BPS)......