【图论】洛谷P2921 在农场万圣节 (纯思维难度图论题)

题目

LP2921

思路

本题基本的思路是这样的,对于一个点,要么在环上要么在链上(链的另一头接着一个环)。对于环上点,求环大小。对于链上点,求链长度+环大小。
显然本题没有固定的算法,纯靠想,思维难度比较大。这里参考洛谷题解高票。

代码

```#include <cstdio>
#include 
#include 
#include 
#include 
#define _for(i,a,b) for(int i = a; i
#define _rep(i,a,b) for(int i = a; i<=b; i++)
using namespace std;

const int maxn = 100000+10;
int n, G[maxn], cmin[maxn], ruhuan[maxn], color[maxn], dfn[maxn];

int main(){
	scanf("%d",&n);
	_rep(i,1,n) scanf("%d",&G[i]);
	
	_rep(cow,1,n)
		for(int u = cow, time = 0; ; u=G[u], ++time){
			if (!color[u]){
				color[u] = cow;
				dfn[u] = time;
			} else if (color[u] == cow) {
				cmin[cow] = time - dfn[u];
				ruhuan[cow] = dfn[u];
				printf("%d\n",time);
				break;
			} else {
				cmin[cow] = cmin[color[u]];
				ruhuan[cow] = time + max(0, ruhuan[color[u]] - dfn[u]);
				printf("%d\n", cmin[cow] + ruhuan[cow]);
				break;
			}
		}
	
	return 0;
}

你可能感兴趣的:(9.noip及时复习)