Sicily 1424. 奖金 解题报告
2014-07-06 09:42
441 查看
题目:1424. 奖金
思路:
结点数达到10000个,用邻接矩阵会内存溢出,所以每个结点用一个vector记录指向的结点。因为一个结点可能有多条进入的路径,要用数组inDegree记录每个结点的入度,只有所有进入路径都访问完才算访问完该结点。如果奖金a > b ,则建立边b -> a。最后如果所有边都排序成功则输出结果,否则就是有环。
代码:
思路:
结点数达到10000个,用邻接矩阵会内存溢出,所以每个结点用一个vector记录指向的结点。因为一个结点可能有多条进入的路径,要用数组inDegree记录每个结点的入度,只有所有进入路径都访问完才算访问完该结点。如果奖金a > b ,则建立边b -> a。最后如果所有边都排序成功则输出结果,否则就是有环。
代码:
#include <iostream> #include <vector> #include <queue> #include <memory.h> using namespace std; const int MAX = 10001; vector<int> adjacent[MAX];//邻接表 int inDegree[MAX];//所有结点的入度 queue<int> q; int money[MAX];//每个结点比100块基本工资多的钱 int main() { int n, m, a, b; cin >> n >> m; int total = 100 * n; memset(inDegree, 0, sizeof(inDegree)); memset(money, 0, sizeof(money)); while(m--){ cin >> a >> b; adjacent[b].push_back(a); inDegree[a]++; } for (int i = 1; i <= n; ++i) { if(inDegree[i] == 0)//入度为0的是根结点 q.push(i); } while(!q.empty()){ a = q.front(); q.pop(); total += money[a]; n--; for (unsigned int i = 0; i < adjacent[a].size(); ++i) { inDegree[adjacent[a][i]]--; if(inDegree[adjacent[a][i]] == 0){//入度变为0说明已经访问完这个结点 q.push(adjacent[a][i]); } money[adjacent[a][i]] = money[a] + 1; } } if(n == 0)//所有结点都已经排序,无环 cout << total << endl; else cout << "Poor Xed" << endl; return 0; }
相关文章推荐
- sicily 1424. 奖金
- sicily 1889解题报告(bfs维护两个队列,实现最短路径)
- Sicily 1046. Plane Spotting 解题报告
- Sicily 1094 Cude解题报告
- Sicily 2302. Queue Implementation Using a Circular Array 解题报告
- Sicily 1006. Team Rankings 解题报告
- Sicily 1176. Two Ends 解题报告
- Sicily 2015. A New Year Gift 解题报告
- Sicily 1012. Stacking Cylinders 解题报告
- Sicily 1146. 采药 解题报告(0-1背包问题)
- sicily1031Campus之最短路径解题报告
- Sicily 2711. 模板与STL 解题报告
- Sicily 1090. Highways 解题报告
- Sicily 1031. Campus 解题报告
- Sicily 1934. 移动小球 解题报告
- Sicily 1150. 简单魔板 解题报告
- Sicily 2002. Feeding Time 解题报告
- Sicily 1543. Completing Brackets 解题报告
- Sicily 1151魔板解题报告
- Sicily 1424. 奖金