华为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