您的位置:首页 > 其它

Sicily 1424. 奖金 解题报告

2014-07-06 09:42 441 查看
题目:1424. 奖金

思路:

  结点数达到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: