Reward HDU杭电2647【反向拓扑+队列】
2015-08-14 20:09
330 查看
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
Sample Output
//我的思路是:先反向拓扑,然后一次一次的把入度为零的找出来,加上888,第二次找到的就加889,依此类推
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
//我的思路是:先反向拓扑,然后一次一次的把入度为零的找出来,加上888,第二次找到的就加889,依此类推
#include<cstdio> #include<cstring> #include<queue> using namespace std; struct Reward { int next; int follow; }arr[20200]; int head[20200]; int indegree[11000]; int st; int n; int sum; bool topo_sort() { int j=1,k; int temp; queue<int>q; while(j<=n) { temp=-1; for(int i=1;i<=n;++i) { if(indegree[i]==0) { sum+=st; temp=i; q.push(i); indegree[i]=-1; ++j; } } st++; if(temp==-1) return 0; while(!q.empty()) { int pos=q.front(); q.pop(); for(k=head[pos];k!=-1;k=arr[k].next) { int v=arr[k].follow; indegree[v]--; } } } return 1; } int main() { int a,b,m; while(~scanf("%d%d",&n,&m)) { st=888;sum=0; memset(head,-1,sizeof(head)); memset(indegree,0,sizeof(indegree)); for(int i=1;i<=m;++i) { scanf("%d%d",&a,&b); arr[i].next=head[b]; arr[i].follow=a;//反向存边 head[b]=i; indegree[a]++; } if(!topo_sort()) printf("-1\n"); else printf("%d\n",sum); } return 0; }
相关文章推荐
- poj 3070 矩阵连乘简单题
- Docker安装应用程序(Centos6.5_x64)
- I学霸官方免费教程四十五 :Java算法之递归算法
- Triangle LOVE(拓扑排序)
- 树莓派用Python写几个简单程序4:socket的使用
- LCS 算法
- HDU 5378 Leader in Tree Land
- 蚂蜂窝特价 v4.4.0 官方安卓版
- Android 入门指引 从零基础学安卓怎么开始
- asp.net mvc dropdownlist
- iOS SDK详解之NSCoding协议
- Codeforces Gym 100379G Wythoff’s game with three piles 博弈
- hdu 4277 USACO ORZ(dfs+剪枝)
- hdu 5381 The sum of gcd 莫队 + DP
- Hdu 2015 Multi-University Training Contest8
- Hit 2255 Not Fibonacci
- URAL-1225 Flags
- 利用curl_multi_init并行多线程处理网络数据
- 很容易学习的JQuery库 : (二) 选择器
- 无常生活,有限奋斗