杭电7- Link with Limit

传送门

思路:

dfs寻找所有的环的平均值。

#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
double a[100010];
int vis[100010];
double sum[100010];
int cnt = 0,flag = 0;
double ans = 0;
void dfs(int x)
{
    
    
	if(vis[x]==0 && flag==0)
	{
    
    
		vis[x]=1;
		dfs(a[x]);
	}
	else
	{
    
    
		if(vis[x]==2)
		{
    
    
			flag = -1;
			cnt--;
			return;
		}
		flag = x;
		ans++;
		sum[cnt]+=a[x];
		vis[x]=2;
		return;
	}
	if(flag>0)
	{
    
    
		vis[x]=2;
		if(flag==x)
		{
    
    
			sum[cnt]/=ans;
			flag = -1;
			return;
		}
		else
		{
    
    
			ans++;
			sum[cnt]+=a[x];
		}
	}
	else
	{
    
    
		vis[x]=2;
		return;
	}
}

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		cnt = 0;
		memset(vis,0,sizeof(vis));
		memset(sum,0,sizeof(sum));
		memset(a,0,sizeof(a));
		int n;
		cin>>n;
		for(int i = 1; i <= n; i++)
		{
    
    
			scanf("%lf",&a[i]);
		}
		for(int i = 1; i <= n; i++)
		{
    
    
			ans = flag = 0;
			if(!vis[i])
			{
    
    
				cnt++;
				dfs(i);
			}
		}
		int f = 0;
		for(int i = 2; i <= cnt; i++)
		{
    
    
			if(sum[i] != sum[i-1])
			{
    
    
				f=1;
				break;
			}
		}
		f?printf("NO\n"):printf("YES\n");
	}
}

おすすめ

転載: blog.csdn.net/p15008340649/article/details/119649400