Reward(拓扑结构+邻接表+队列)

Reward

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 7   Accepted Submission(s) : 3

Problem Description

Dandelion‘s uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.
The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a‘s reward should more than b‘s.Dandelion‘s unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work‘s reward will be at least 888 , because it‘s a lucky number.

Input

One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000) then m lines ,each line contains two integers a and b ,stands for a‘s reward should be more than b‘s.

Output

For every case ,print the least money dandelion ‘s uncle needs to distribute .If it‘s impossible to fulfill all the works‘ demands ,print -1.

Sample Input

2 1 1 2 2 2 1 2 2 1

Sample Output

1777 -1

题解:

错了n次才在大神的帮助下解决;自己犯的错误有两点:

一:没理解清题意;题上说的是a比b大;

二:自己只判断了第一次成环,没考虑中间成环的情况;

应该加个temp计数,如果temp==N;证明没有成环;

我的思路就是每次记录当前层的个数,每次弹出一个就加一个;每进一层value值就加一;

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 const int MAXN=10010;
 6 struct Node{
 7     int to,next;
 8 };
 9 Node edg[MAXN*2];
10 int head[MAXN];
11 int que[MAXN];
12 queue<int>dl;
13 int money,N,M,flot;
14 void topu(){
15     int temp;
16     for(int i=1;i<=N;i++){
17         if(!que[i]){
18             dl.push(i);
19         }
20     }
21     int value=888;
22     temp=0;
23     while(!dl.empty()){
24             int t=dl.size();
25         while(t--){
26         int k=dl.front();
27         money+=value;
28         dl.pop();
29         temp++;
30         for(int j=head[k];j!=-1;j=edg[j].next){
31             que[edg[j].to]--;
32             if(!que[edg[j].to])dl.push(edg[j].to);
33         }
34         }
35         value++;
36     }
37     if(temp==N)
38     printf("%d\n",money);
39     else puts("-1");
40 }
41 void initial(){
42     memset(head,-1,sizeof(head));
43     memset(que,0,sizeof(que));
44     while(!dl.empty())dl.pop();
45     money=0;flot=1;
46 }
47 int main(){
48     int a,b;
49     while(~scanf("%d%d",&N,&M)){
50             initial();
51         for(int i=0;i<M;i++){
52             scanf("%d%d",&a,&b);
53             edg[i].to=a;
54             edg[i].next=head[b];
55             head[b]=i;
56             que[a]++;
57         }
58         topu();
59     }
60     return 0;
61 }
时间: 2024-10-12 17:11:02

Reward(拓扑结构+邻接表+队列)的相关文章

哈理工oj Touring (最短路 dij算法 邻接表 + 队列 )

Touring Time Limit: 1000 MS Memory Limit: 32767 K Total Submit: 257(46 users) Total Accepted: 108(39 users) Rating: Special Judge: No Description The best friends Mr. Li and Mr. Liu are touring in beautiful country M. M has n cities and m two-way roa

uva 11374 Airport Express(spfa 邻接表+队列)

Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more quickly than other transports. There are two types of trains in Airport-Express, the Economy-Xpress and theCommercial-Xpress

确定比赛名次(map+邻接表 邻接表 拓扑结构 队列+邻接表)

确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 40   Accepted Submission(s) : 31 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的

最短路径(四)—Bellman-Ford的队列优化(邻接表)

上一节我们写了Bellman-Ford算法解决负权边的问题: 邻接表存储图: n个顶点,m条边. 数组实现邻接表.对每一条边进行1-m编号.用u,v,w三个数组来记录每条边的信息,即u[i],v[i],w[i]表示第i条边是从第 u[i]号顶点到v[i]号顶点且权值为w[i]. first数组的1-n号单元格分别用来存储1-n号顶点的第一条边的编号,初始的时候因为没有边加入所有都是-1.即first[u[i]]保存顶点u[i]的第一条边的编号,next[i]存储"编号为i的边"的&qu

图的广度度优先遍历算法运用队列主针对邻接表有向图

源代码如下: #include<iostream> using namespace std; #define MAX_VERTEX_NUM 20 typedef int EdgeData; typedef char VertexData; //顶点数据域 typedef struct node { // 边表节点 EdgeData cost; //边上d权值 int adjvex; //邻接点域 struct node *next; //下一边链接指针 }EdgeNode; typedef s

ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TshingHua OJ-旅行商TSP)

做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(TSP) Description Shrek is a postman working in the mountain, whose routine work is sending mail to n villages. Unfortunately, road between villages is

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另