2020/04/15华为机试题目三

测试用例
第一行 函数个数 每个函数调用的函数个数
接下来每一行 函数栈容量 调用的函数编号
求有向图最大点权路径和 如果有环返回R
5 2 3 1 0 0
1 20 2 3
2 30 3 4 5
3 50 4
4 60
5 80

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
struct Node{
    //栈容量
    int v;
    //有向图 目的点
    vector <int> number;
    //有几个目的点
    int k;
    //以此结点为起点 的路径 是否有环
    bool flag = false;
}Node[10010];
int N;
vector<int> ans;
void dfs(int i,int temp,int &sum){

   //回溯将全部路径点权和放进ans  ans保存的是全部的路径点权和
    if(Node[i].number.size()==0){
        ans.push_back(sum);
        return ;
    }
    for(int j = 0;j<Node[i].number.size();j++){
    if(Node[i].number[j]==temp){
            Node[i].flag = true;
            return;
        }
         sum = sum+ Node[Node[i].number[j]].v;
         dfs(Node[i].number[j],temp,sum);
         sum = sum -  Node[Node[i].number[j]].v;
    }
}

int main() {
    cin>>N;
    for(int i =1;i<=N;i++){
        int value;
        cin>>value;
        Node[i].k = value;
    }
    for(int  i = 1;i<=N;i++){
        int M;
        cin>>M;
        int va;
        cin>>va;
        Node[M].v = va;
        for(int j = 0;j<Node[M].k;j++){
            int number;
            cin>>number;
            Node[M].number.push_back(number);
        }
    }
    for(int i = 1;i<=N;i++){
        int s=Node[i].v;
        dfs(i,i,s);
        //判断是否有环
        if(Node[i].flag){
            cout<<"R"<<endl;
            return 0;
        }
    }
    sort(ans.begin(),ans.end());
    cout<<ans[ans.size()-1]<<endl;
    return 0;
}
全部评论

相关推荐

10-17 17:14
门头沟学院 C++
牛客410039819号:北京地区大多是919和927,这两场挂太多人了
投递华为等公司10个岗位
点赞 评论 收藏
分享
我在朝九晚六双休的联想等你:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
评论
点赞
4
分享
牛客网
牛客企业服务