zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    【码上微服务】- 环境搭建
    【码上微服务】- 环境搭建
    Python 3版本 开始
    算法理解之大数相乘问题
    mycat配置分库分表 读写分离 linux系统
    es6的数组去重
    解析Java为什么不接受合法的HTTPS证书
    为什么要创建开放源码的PlayScala社区?
    实时同步MongoDB Oplog开发指南
    Scala基础
  • 原文地址:https://www.cnblogs.com/jolin123/p/3826744.html
Copyright © 2011-2022 走看看