codeforces 884C Bertown Subway

http://codeforces.com/problemset/problem/884/C




找环,再按每个环内元素的数量从大到小排序,把前2个大的求和,再将这个和与其他的数求平方和。



#include <bits/stdc++.h>
using namespace std;
int con=0;long long int  ans[111111]; bool vis[111111];    int ma[111111];
void dfs(int x,int num)
{
	if(vis[ma[x]]==1)
	{
		ans[con]=num-1;
		con++;
		return;
	}
	else {
		vis[ma[x]]=1;
		dfs(ma[x],num+1);
	}
}
int main()
{
   long long int n;

    
    
    while(cin>>n){
    	memset(ma,0,sizeof(ma));
    	memset(vis,0,sizeof(vis));
		memset(ans,0,sizeof(ans)); 
    	con=0;
    	int i;
    	int x,y;
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&x);
    		ma[i]=x;
		}
		for(i=1;i<=n;i++)
		{
			if(vis[i]==0)
			{
				vis[i]=1;
				dfs(i,2);
			}
		}
		//for(i=0;i<con;i++)
		//cout<<ans[i]<<" ";
		//cout<<endl;
		if(con<=2){
			long long int a=n*n;
			cout<<a<<endl;
		}
		else{
			sort(ans,ans+con);
			long long int a=0;
			a+=(ans[con-1]+ans[con-2])*(ans[con-1]+ans[con-2]);
			for(int j=0;j<=con-3;j++)
			{
				a+=ans[j]*ans[j];
			}
			cout<<a<<endl;
		}
	}
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值