JZOJ7月25日提高组T1 挑竹签
发布日期:2021-05-06 15:39:39 浏览次数:16 分类:精选文章

本文共 862 字,大约阅读时间需要 2 分钟。

JZOJ7月25日提高组T1 挑竹签

题目

挑竹签——小时候的游戏

夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏。
挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签。如果动了其他的竹签,就要换对手来挑。在所有的竹签都被挑走之后,谁挑走的竹签总数多,谁就胜了。
身为神明的诹访子自然会让早苗先手。为了获胜,早苗现在的问题是,在诹访子出手之前最多能挑走多少竹签呢?
为了简化问题,我们假设当且仅当挑最上层的竹签不会动到其他竹签。

题解

题意

n n n个竹签,竹签之间有压着的关系

要取当前竹签,必须满足它不被任何竹签压着
求能取的最多竹签

分析

把压着的关系转换成有向图

这题就很明显是一个拓扑题
每次寻找入度为0的点,答案加一
然后就是:删边、找点、加答案、删边、找点
找到最后找不到点了
输出答案

Code

#include
#include
using namespace std;struct node{ int head,to,next;}a[1000005];int n,m,i,x,y,h,t,tot,ans,d[10000005],num[1000005];bool b[1000005];int main(){ freopen("mikado.in","r",stdin); freopen("mikado.out","w",stdout); scanf("%d%d",&n,&m); for (i=1;i<=m;i++) { scanf("%d%d",&x,&y); tot++; a[tot].to=y; a[tot].next=a[x].head; a[x].head=tot; num[y]++; } h=0; t=0; for (i=1;i<=n;i++) { if (num[i]==0) { t++; d[t]=i; b[i]=true; ans++; } } while (h
上一篇:JZOJ7月25日提高组反思
下一篇:JZOJ7月24日提高组T3 终章-剑之魂

发表评论

最新留言

很好
[***.229.124.182]2025年04月16日 03时45分56秒