ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

华为23实习笔试2_拓扑排序

2022-04-07 21:32:58  阅读:150  来源: 互联网

标签:tmp count relay 23 int 拓扑 华为 bool include


输入一个有向图,判断能否到达目标节点
不能到达输出-1,可以输出路径

//#include<bits/stdc++.h>
#include<cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

int relay[5000][5000];    //依赖关系
bool arr[5000];//记录是否能到达
bool att[5000];//记录访问过,防止循环依赖,访问过但不可达直接返回false
stack<int> s;  //记录路径

bool dfs(int n)
{
    s.push(n);
    if(relay[n][0]==0){
        return true;
    }
    if(arr[n]){ //可达
        return true;
    }else if(att[n]){ //排除循环依赖
        return false;
    }
    att[n] = true; //访问过
    bool b = true;
    for (int i = 1; i <= relay[n][0];i++)
    {
        b = b & dfs(relay[n][i]);
    }
    if(b){
        arr[n] = true;//可达
        return true;
    }else{
        s.pop();
    }
    return false;
}

int main()
{
    int n,m;
    cin >> n>>m;
    memset(relay, 0, sizeof(relay));
    memset(arr, 0, sizeof(arr));
    memset(att, 0, sizeof(att));
    string str;
    for (int i = 0; i < n;i++){
        cin >> str;
        int tmp = 0,count=0;//分割整数,整数数组中的列数
        for(auto ch:str){
            if(ch!=','){
                tmp = tmp * 10 + ch - '0';
            }else{
                relay[i][count] = tmp;
                tmp = 0;
                count++;
            }
        }
        relay[i][count] = tmp;
        tmp = 0;
        count++;
    }
    bool b = dfs(m);
    if(b){
        cout << s.top();
        s.pop();
        while(s.size()>1){
            int t = s.top();
            s.pop();
            cout <<","<< t ;
        }
    }else{
        cout << -1 << endl;
    }
    return 0;
}
/*
输入:
4
2
0
1,0
1,1
2,0,1
输出:
0,1
解释:
执行0后可以执行1,之后可以执行任务2; 输出 0,1后可以执行目标任务

拓扑排序
节点个数,目标任务编号;
节点依赖个数:依赖节点编号
*/

 

标签:tmp,count,relay,23,int,拓扑,华为,bool,include
来源: https://www.cnblogs.com/wined/p/16114340.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有