是否有一种方法,使得这个代码能够在特定情况下被优化?
  • 板块学术版
  • 楼主Quartz_Blocks
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/30 11:17
  • 上次更新2024/11/30 14:11:33
查看原帖
是否有一种方法,使得这个代码能够在特定情况下被优化?
1059176
Quartz_Blocks楼主2024/11/30 11:17
#include <bits/stdc++.h>
using namespace std;

struct node{
	int u,v,nxt;
}e[100010];
int cnt = 0;
int n;
int a[100010];
int hd[100010];
void add_edge(int u,int v){
	e[++cnt] = node{u,v,hd[u]};
	hd[u] = cnt;
}
bool vis[100010];
bool ans[100010];
bool submit = 0;
int main(){
	if(submit){
		freope\
n("shuffle.in","r",stdin);
		freope\
n("shuffle.out","w",stdout);
	}
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> a[i];
	for(int i = 1;i <= n;i++){
		add_edge(i,a[i]);
	}
	for(int i = 1;i <= n;i++){
		if(ans[i]) continue;
		memset(vis,0,sizeof(vis));
		int u = i,v = 0;
		while(hd[u] != 0){
			v = e[hd[u]].v;
			vis[u] = 1;
			if(!vis[v]){
				u = v;
			}else break;
		}
		if(v == i){
			ans[i] = 1;
		}
	}
	int cnt = 0;
	for(int i = 1;i <= n;i++){
		if(ans[i]) cnt++;
	}
	cout << cnt << endl;
	
	
	
	return 0;
}

使它在如

1 2

2 3

3 4

...

n-1 n

n 1

这种图达到 O(n) 的复杂度?

2024/11/30 11:17
加载中...