Reward 2647 (拓扑排序+邻接表)
来源:互联网 发布:没入职叫我写seo方案 编辑:程序博客网 时间:2024/06/10 19:59
Reward
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5701 Accepted Submission(s): 1730
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.
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.
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 11 22 21 22 1
Sample Output
1777-1#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;struct zz{int to;int next;}p[51000];int in[51000];int head[51000];int num[51000];void topo(int n){queue<int>q;int i,j,k;int ans=0;int sum=0;for(i=1;i<=n;i++){if(in[i]==0)q.push(i);}while(!q.empty()){k=q.front();q.pop();ans++;for(j=head[k];j!=-1;j=p[j].next){in[p[j].to]--;if(in[p[j].to]==0){q.push(p[j].to);num[p[j].to]=num[k]+1;}}}for(i=1;i<=n;i++)sum+=num[i];if(ans!=n)printf("-1\n");elseprintf("%d\n",sum);}int main(){int n,m,i,j,a,b;while(scanf("%d%d",&n,&m)!=EOF){memset(in,0,sizeof(in));memset(head,-1,sizeof(head));for(i=1;i<=n;i++)num[i]=888;for(i=0;i<m;i++){scanf("%d%d",&a,&b);p[i].to=a;p[i].next=head[b];head[b]=i;in[a]++;}topo(n);}return 0;}//大神的代码#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>using namespace std;int n,m;int indegree[10010];struct Node{int to;int next;}A[20010];int head[10010];int value[10010];void INPUT(){int i,j,a,b;memset(head,-1,sizeof(head));memset(indegree,0,sizeof(indegree));for(i=0;i<m;++i){scanf("%d%d",&a,&b);A[i].to=a;A[i].next=head[b];head[b]=i;indegree[a]++;}}void Topo(){int i,j;queue<int>Q;for(i=1;i<=n;++i){value[i]=888;if(indegree[i]==0){Q.push(i);}}int top,money=0,ans=0;while(!Q.empty()){ans++;top=Q.front();Q.pop();indegree[top]=-1;money+=value[top];for(int k=head[top];k!=-1;k=A[k].next){indegree[A[k].to]--;if(indegree[A[k].to]==0){Q.push(A[k].to);}value[A[k].to]=value[top]+1;}}if(ans==n)printf("%d\n",money);elseprintf("-1\n");}int main(){while(scanf("%d%d",&n,&m)!=EOF){INPUT();Topo();}return 0;}
0 0
- Reward 2647 (拓扑排序+邻接表)
- Reward(拓扑排序+邻接表)
- hdu 2647 Reward(拓扑排序+邻接表)
- hdoj 2647 Reward ( 拓扑排序--邻接表+队列 )
- hdu 2647 Reward 拓扑排序+向前星邻接表
- HDOJ 题目2647 Reward(拓扑排序,邻接表建图)
- 【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
- HDOJ 2647 Reward(拓扑排序(节点含值)+邻接表)
- Reward(拓扑排序)
- HDU 2647 Reward(拓扑排序)
- hdu 2647 Reward (拓扑排序)
- HDOJ 2647 Reward(分层拓扑排序)
- hdu 2647 Reward ( 拓扑排序 )
- HDU 2647 - Reward(拓扑排序)
- hdu 2647 Reward (拓扑排序)
- HDU 2647Reward(拓扑排序)
- HDU 2647 Reward(图论-拓扑排序)
- HDU 2647 Reward(图论-拓扑排序)
- 归并排序
- 如何实现文件的断点续传,文件下载
- SQLServer With As 用法
- HDU 2563 统计问题(递推)
- HDU-2111 Saving HDU
- Reward 2647 (拓扑排序+邻接表)
- Summary for week5
- ImageView scaleType
- Linux的mount命令详解
- Javascript中的Label语句
- 邮件的发送与接收原理(javaweb)
- 网易校招面试
- 小黑华丽的逆袭!!!
- centos6.5 切换桌面模式与命令行模式