HDOJ 2647 Reward

Reward

拓扑排序判断是否成环。使用vector做邻接表。这部分正常写

最小金额的话 我是对每个人初始都是888.

然后举个例子

a是某一个入度为0的人,之后在a的邻接表中的人金额都要变化

当b的金额变化是 如果b金额本身就大于a(a之前某个点遍历时操作过b金额了) 不需要增加

但如果小于等于a的金额,b的金额就更新为 a金额+1

我觉得这个题要点就在这里吧

#include <bits/stdc++.h>
using namespace std;
int visit[10001]={0};
struct node
{
    vector<int>arr;
    int in;
    int monery;
};
node *li=NULL;
int main()
{
    //freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
    int n,m,a,b;
    while (~scanf("%d%d",&n,&m))
    {
        li=new node[n+1];
        for(int i=1;i<=n;i++)
        {
            li[i].in=0;
            visit[i]=0;
            li[i].monery=888;
        }
        for(int i=0;i<m;i++){
            scanf("%d%d",&a,&b);
            li[b].arr.push_back(a);
            li[a].in++;
        }
        queue<int>q;
        long long out=0;
        for(int i=1;i<=n;i++)
        {
            if(li[i].in==0){
                q.push(i);
                visit[i]=1;
            }
            
        }
        int cnt=0;
        while (!q.empty())
        {
            int t=q.front();q.pop();cnt++;
            out+=li[t].monery;
            for(int i=0;i<li[t].arr.size();i++)
            {
                int temp=li[t].arr[i];
                li[temp].in--;
                if(li[temp].monery<=li[t].monery)li[temp].monery=li[t].monery+1;
                if(li[temp].in==0&&visit[temp]==0)
                {
                    q.push(temp);
                    visit[temp]=1;
                }
            }
        }
        if(cnt==n)printf("%lld\n",out);
        else printf("-1\n");
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值