Sicily 1424. 奖金 解题报告

题目:1424. 奖金

 

思路:

  结点数达到10000个,用邻接矩阵会内存溢出,所以每个结点用一个vector记录指向的结点。因为一个结点可能有多条进入的路径,要用数组inDegree记录每个结点的入度,只有所有进入路径都访问完才算访问完该结点。如果奖金a > b ,则建立边b -> a。最后如果所有边都排序成功则输出结果,否则就是有环。

 

 

 

代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 #include <memory.h>
 5 using namespace std;
 6 
 7 const int MAX = 10001;
 8 vector<int> adjacent[MAX];//邻接表
 9 int inDegree[MAX];//所有结点的入度
10 queue<int> q;
11 int money[MAX];//每个结点比100块基本工资多的钱
12 
13 
14 
15 int main() {
16     int n, m, a, b;
17     cin >> n >> m;
18     int total = 100 * n;
19     memset(inDegree, 0, sizeof(inDegree));
20     memset(money, 0, sizeof(money));
21     while(m--){
22         cin >> a >> b;
23         adjacent[b].push_back(a);
24         inDegree[a]++;
25     }
26     for (int i = 1; i <= n; ++i) {
27         if(inDegree[i] == 0)//入度为0的是根结点
28             q.push(i);
29     }
30     while(!q.empty()){
31         a = q.front();
32         q.pop();
33         total += money[a];
34         n--;
35         for (unsigned int i = 0; i < adjacent[a].size(); ++i) {
36             inDegree[adjacent[a][i]]--;
37             if(inDegree[adjacent[a][i]] == 0){//入度变为0说明已经访问完这个结点
38                 q.push(adjacent[a][i]);
39             }
40             money[adjacent[a][i]] = money[a] + 1;
41         }
42     }
43     if(n == 0)//所有结点都已经排序,无环
44         cout << total << endl;
45     else
46         cout << "Poor Xed" << endl;
47     return 0;
48 }

 

 

 

posted @ 2014-07-06 09:42  Jolin123  阅读(316)  评论(0编辑  收藏  举报