杭电2647 Reward

原创 2015年11月20日 20:29:33

Reward

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6267    Accepted Submission(s): 1934


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
 

Author
dandelion
 

Source
 


此题优先队列无解,必须反向建图:

#include<stdio.h>
#include<queue>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
	int u,v,w,next;
}t[1100000];
int head[110000],i,j,k,l,m,n,dig[110000],cnt,u,v,ans,flag[110000],num;
void topo()
{
	//priority_queue<int >q;
	//priority_queue<int>q;
	queue<int>q;
	int i,c=0;
	for(i=1;i<=m;i++)
	if(dig[i]==0)
	{
		q.push(i);
	//	ans++;
	}
	while(!q.empty())
	{
		//int x=q.top();
		int x=q.front();
		q.pop();
		ans++;
		num+=flag[x];
		for(i=head[x];i!=-1;i=t[i].next)
		{
			int y=t[i].v;
			dig[y]--;
			if(dig[y]==0)
			{
				q.push(y);
				flag[y]=flag[x]+1;
			}
		}
	}
	if(ans!=m)
	num=-1;
}
int main()
{
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		memset(head,-1,sizeof(head));
		memset(flag,0,sizeof(flag));
		memset(dig,0,sizeof(dig));
		cnt=ans=0;
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&v,&u);
			t[cnt].u=u;
			t[cnt].v=v;
			t[cnt].next=head[u];
			head[u]=cnt++;
			dig[v]++;
		}
		num=888*m;
		topo();
		printf("%d\n",num);
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【杭电oj2647】Reward

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...

杭电acm 3613Best Reward(字符串)

Best Reward Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) T...

HDU2647:Reward(拓扑排序)

Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S...

HDU2647_reward-拓扑排序

真的是简单的拓扑排序应用吗??师兄们别坑啦~~wa了几次就因为数据没处理好。。思路简单,但数据的处理很微妙,本以为自己总是对的,没想到还有脱离自己方法的测试数据。。但还是受益匪浅——每每碰到WA,检查...

hdu 2647 Reward 拓扑排序+向前星邻接表

传送门:hdu 2647 REward题目大意有个老板要给员工发工资,老板很善良想满足每个员工的要求 ,但是他很吝啬。解题思路先解释一下什么是向前星邻接表; 一般在一个图当中我们使用邻接矩阵表示连个...

HDU——2647Reward(DFS或差分约束)

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...

HDU:2647 Reward(链表型拓扑排序)

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...

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

Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...

HDU-2647 Reward(拓扑排序)

第一道拓扑排序题目,很简单,但是书上讲的是用栈实现的,不会应用在这道需要分层的题,看了别人用队列实现的感觉很简单易懂,便按照类似的思路写了一次,效率貌似有点低,毕竟用了vector和队列,还需要更多的...

拓扑排序学习小记 HDU 1285 确定比赛名次 + HDU 2647 Reward

拓扑排序,以下摘自http://blog.csdn.net/midgard/article/details/4101025: 拓扑排序是对有向无环图(DAG图)的一种排序。表示了顶点按边的方向出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)