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 }