题解 | 谍中谍中谍中谍中谍...

谍中谍中谍中谍中谍...

https://www.nowcoder.com/practice/ee1246384c9b4066b67043ebb37fd9c9

#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <set>

using namespace std;
//图的特点是出度全为1,且每个点至多在一个环上,且从点出发路径唯一且经过唯一的环。对于在环上的点就是本身,不在环上就是第一个经过的环上的点
int main () {
	int n;
	cin >> n;
	int* edge = new int[n + 1];
	int* in_degree = new int[n + 1];
	int* ans = new int[n + 1];
	memset(edge, 0, (n + 1) * sizeof(int));
	memset(in_degree, 0, (n + 1) * sizeof(int));
	//ans表示是不是环 
	memset(ans, 0, (n + 1) * sizeof(int));
	for (int i = 1; i <= n; i++) {
		cin >> edge[i];
		in_degree[edge[i]]++;
	}
	for (int i = 1; i <= n; i++) {
		//开始遍历 
		if (!in_degree[i]) {
			int* vis = new int[n + 1];
			memset(vis, 0, (n + 1) * sizeof(int));
			stack<int> s;;
			
			int p = i;
			while (!ans[p] && !vis[p]) {
				vis[p] = 1;
				s.push(p);
				p = edge[p];
			}
			bool flag = (ans[p] && ans[p] == p) ? false : true;
			while (!s.empty()) {
				int p2 = s.top();
				s.pop();
				ans[p2] = flag ? p2 : p;
				if (p == p2) flag = false;
			}
  		}
	}
	for (int i = 1; i <= n; i++) {
		cout << (ans[i] == 0 ? i : ans[i]) << " " ;
	}
}

全部评论

相关推荐

牛客49269852...:这家公司纯神人公司来的,约的我今早11点线下面试,我人都到了,10点和我说改线上,无敌
找实习记录
点赞 评论 收藏
分享
02-28 01:18
已编辑
南昌大学 后端工程师
后测速成辅导一两个月...:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务