题意:输入n表示有n个车站
输入n个数,表示这些从这些车站出发可以到达的车站
输出:最多修改两个车站的到达站点,并且满足限制条件,求最大的路线数。
限制条件:一个车站有且仅有一个到达车站。
可以从这个车站到它本身
思路:其实就是一个很简单的题目…
由于公式a^2+b^2<(a+b)^2,易知我们只需找出两个最大的环,将这两个环融合。然后每个环内节点数的平方和就是答案。若整个铁路系统是一个环,那么直接平方就是答案。
虽然这么简单一眼就看懂了但是还是莫名地WA了= =
WA代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN =1e5+7;
int p[MAXN],visit[MAXN];
vector<long long> pa;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++){
cin>>p[i];
}
int maxn=0,maxm=0;
for(int i=1;i<=n;i++){
int now=i;
int loop=1;
if(visit[now]) continue;
// cout<<"now=="<<now<<endl;
while(p[now]!=i){
loop++;
visit[now]++;
now=p[now];
}
visit[now]++;
// cout<<"loop=="<<loop<<endl;
if(loop==n){
pa.push_back(loop);
break;
}
else if(loop>maxn){
pa.push_back(maxn);
maxn=loop;
}
else if(loop>maxm){
pa.push_back(maxm);
maxm=loop;
}
else pa.push_back(loop);
}
// cout<<maxm<<endl;
// cout<<maxn<<endl;
pa.push_back(maxm+maxn);
long long ans=0;
while(!pa.empty()){
long long a=pa.back();
ans+=a*a;
pa.pop_back();
}
cout<<ans<<endl;
return 0;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN =1e5+7;
int p[MAXN],visit[MAXN];
vector<long long> pa;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++){
cin>>p[i];
}
int maxn=0,maxm=0;
for(int i=1;i<=n;i++){
int loop=0;
if(!visit[i]){
int j=i;
while(!visit[j]){
visit[j]++;
loop++;
j=p[j];
}
}
pa.push_back(loop);
}
// cout<<maxm<<endl;
// cout<<maxn<<endl;
long long ans=0;
sort(pa.begin(),pa.end());
long long addi=pa.back();
if(n==1){
ans=n;
addi=0;
}
else{
ans=pa.back()*pa.back();
pa.pop_back();
ans+=pa.back()*pa.back();
addi=addi*2*pa.back();
pa.pop_back();
while(!pa.empty()){
long long a=pa.back();
ans+=a*a;
pa.pop_back();
}
}
cout<<ans+addi<<endl;
return 0;
}