洛谷 #2661. 信息傳遞

題意

在有 \(\ n\) 條邊的圖中找最短路

題解

並查集,維護父親及路徑長度

調試記錄

#include <cstdio>
#include <algorithm>
#define maxn 200005
#define INF 0x3f3f3f3f

using namespace std;

int n, ans = INF, f[maxn], dis[maxn];

int getf(int x){
	if (x == f[x]) return x;
	else{
		int tmp = f[x];
		f[x] = getf(f[x]);
		dis[x] += dis[tmp];
		return f[x];
	} 
}

void Union(int x, int y){
	int u = getf(x), v = getf(y);
	if (u != v){
		f[u] = v;
		dis[x] = dis[y] + 1;
	}
	if (u == v){
		ans = min(ans, dis[x] + dis[y] + 1);
	}
}

int main(){
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) f[i] = i;
	
	for (int a, i = 1; i <= n; i++){
		scanf("%d", &a);
		Union(i, a);
	}
	printf("%d\n", ans);
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章