hdu2647(拓扑排序)

链接:点击打开链接

题意:每一个人的基本工资为888,给出两个人的关系a,b,代表a的工资比b高问满足全部条件的话,最少须要支付多少钱

代码:

#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
vector<int> G[10005];
int d[10005],deg[10005];
int topo(){
    int i,j,u,v,op;
    queue<int> qu;
    for(i=1;i<=n;i++)
    if(deg[i]==0)
    qu.push(i);
    op=0;
    while(qu.size()){
        u=qu.front();
        qu.pop();
        op++;
        for(i=0;i<G[u].size();i++){
            v=G[u][i];
            deg[v]--;
            d[v]=max(d[v],d[u]+1);              //相当于求关键路劲
            if(deg[v]==0)
            qu.push(v);
        }
    }
    if(op!=n)
    return 0;
    return 1;
}
int main(){
    int i,j,u,v,ans;
    while(scanf("%d%d",&n,&m)!=EOF){
        for(i=1;i<=n;i++){
            G[i].clear();
            d[i]=deg[i]=0;
        }
        for(i=1;i<=m;i++){                      //反向建图拓扑更新一下
            scanf("%d%d",&u,&v);
            G[v].push_back(u);
            deg[u]++;
        }
        if(topo()==0)
        puts("-1");
        else{
            ans=0;
            for(i=1;i<=n;i++)
            ans+=d[i];
            printf("%d\n",ans+888*n);
        }
    }
    return 0;
}
时间: 2024-08-08 21:55:22

hdu2647(拓扑排序)的相关文章

HDU2647(拓扑排序+反向建图)

题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,由于尽可能的让老板少付钱,那么a的工资就是b的工资+1,可以确定关系为a>b,根据拓扑排序建边的原则是把"小于"关系看成有向边,那么我们可以建边v->u. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #

HDU2647 Reward 【拓扑排序】

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3927    Accepted Submission(s): 1199 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he w

hdu2647(拓扑排序)

这道题题意很简单,老板给员工发福利,有些员工要求自己的福利必须比某个人高,老板希望在满足所有人的要求下,总花费最小. 拓扑排序分层,反向建表,正向也可以,只不过计算稍微麻烦些,但更接近题意. 这道题我还是卡了一会的,一开始用下标模拟堆栈的方法wa了好多次,后来试着调用stl的栈,接着wa,才发现是自己的分层策略和栈的性质不相容. 我的分层策略是,若有个点,在删去一个边之后入度变为0,则这个点的层数为刚刚删掉的那条边的起点的层数加1. 使用这种策略加上用栈会在处理一些特殊情况是发生错误.后来改为用

hdu2647 Reward 拓扑排序

此题的关键在于分层次,最低一层的人的奖金是888,第二层是888+1 …… 分层可以这样实现.建立反向图.在拓扑排序的时候,第一批入度为0的点就处于第一层,第二批处于第二层 …… 由于是逐个遍历入度为0的点,所以怎么实现上面所说的第一批,第二批就需要动点脑. 可以试试下面的测试数据: 4 31 32 34 3 4 31 22 34 3 4 21 23 4 6 31 23 45 6 测试结果依次是: 3555 3556 3554  5331 #include<iostream> #include

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu

hdu1285(拓扑排序)

这道题要求没有输赢关系的两个元素必须按照升序输出,有输赢关系的,赢得在输的前面,所以用队列或者栈来降低时间复杂度的优化过的拓扑排序会出错. 比如这组输入 5 3 1 2 2 3 4 5 至少我写的两种拓扑排序都wa了.但是不用队列或者栈来优化的话, 1.每次都从头至尾扫描一遍,找到一个没标记过的节点, 2.将它标记 3.然后删除从它出来的每条边. 重复这三个操作,加标记的次序,就是题目要的答案. 下面的代码中用到了队列,但只是用来保存答案而已.并没有用它优化的意思. #include <iost