秘密沉睡在森林里

Description

夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏。

挑竹签,就是在桌上摆上一把竹签,每次从最上层挑走一根竹签。如果动了其他的竹签,就要换对手来挑。在所有的竹签都被挑走之后,谁挑走的竹签总数多,谁就胜了。

身为神明的诹访子自然会让早苗先手。为了获胜,早苗现在的问题是在诹访子出手之前最多能挑走多少竹签呢?

为了简化问题,我们假设当且仅当挑最上层的竹签不会动到其他竹签。

Analysis

题意:请打一个拓扑排序标程。

Code

#include <bits/stdc++.h>
int cnt[1000010],tot,head[1000010];
struct edge{
    int v,next;
}p[1000010];
void add(int u,int v){
    p[++tot].v=v;
    p[tot].next=head[u];
    head[u]=tot;
}
std::queue <int> b;
int main(){
    freopen("mikado.in","r",stdin);
    freopen("mikado.out","w",stdout);
    int n,m;
    scanf("%d%d",&n,&m);
    while(m--){
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        cnt[v]++;
    }
    for(int i=1;i<=n;i++)
        if(!cnt[i])b.push(i);
    int ans=0;
    while(!b.empty()){
        int f=b.front();
        ans++;
        b.pop();
        for(int i=head[f];i;i=p[i].next){
            int v=p[i].v;
            cnt[v]--;
            if(!cnt[v])b.push(v);
        }
    }
    printf("%d\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/qswx/p/9644080.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值