其他分享
首页 > 其他分享> > 华为23实习笔试2_拓扑排序

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

作者:互联网

输入一个有向图,判断能否到达目标节点
不能到达输出-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