Reward
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2647 Accepted Submission(s): 768
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.
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <queue> using namespace std; const int N = 10005; struct edge { int w; edge *next; }*e[N]; int cnt; int deg[N], money[N]; int n, m; void init() //初始化 { cnt = 0; for(int i = 0; i <= n; i++) { e[i] = NULL; money[i] = 888; deg[i] = 0; } } void add(int x, int y) //建边 { edge *p = (edge *)malloc(sizeof(edge)); p->w = y; p->next = e[x]; e[x] = p; } int main() { int i, x, y, k, u, num, sum; while(scanf("%d %d", &n, &m) != EOF) { init(); sum = 0; num = n; for(i = 1; i <= m; i++) { scanf("%d %d", &x, &y); add(y, x); //建边 deg[x]++; //度数++ } queue<int> Q; for(i = 1; i <= n; i++) { if(deg[i] == 0) Q.push(i); } while(!Q.empty()) { k = Q.front(); Q.pop(); num--; for(edge *p = e[k]; p; p = p->next) //链表代替矩阵 { u = p->w; if(--deg[u] == 0) //和k连接的点度数--,若为0,入队列 { money[u] = money[k] + 1; //钱比连接点k的钱多1 Q.push(u); } } } if(num > 1) printf("-1\n"); //入队列次数少于n,证明有环 else { for(i = 1; i <= n; i++) { sum += money[i]; } printf("%d\n", sum); } } return 0; }