AtCoder Regular Contest 097 D - Equals

BUG反馈门

D - Equals

Time limit : 2sec / Memory limit : 1024MB

Score : 400 points

Problem Statement

We have a permutation of the integers from 1 through Np1p2, .., pN. We also have M pairs of two integers between 1 and N (inclusive), represented as (x1,y1),(x2,y2), .., (xM,yM). AtCoDeer the deer is going to perform the following operation on p as many times as desired so that the number of i (1  i  N) such that pi=iis maximized:

• Choose j such that 1  j  M, and swap pxj and pyj.

Find the maximum possible number of i such that pi=i after operations.

Constraints

• 2  N  105
• 1  M  105
• p is a permutation of integers from 1 through N.
• 1  xj,yj  N
• xj  yj
• If i  j{xi,yi}  {xj,yj}.
• All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
p1 p2 .. pN
x1 y1
x2 y2
:
xM yM


Output

Print the maximum possible number of i such that pi=i after operations.

Sample Input 1

Copy
5 2
5 3 1 4 2
1 3
5 4


Sample Output 1

Copy
2


If we perform the operation by choosing j=1p becomes 1 3 5 4 2, which is optimal, so the answer is 2.

Sample Input 2

Copy
3 2
3 2 1
1 2
2 3


Sample Output 2

Copy
3


If we perform the operation by, for example, choosing j=1j=2j=1 in this order, p becomes 1 2 3, which is obviously optimal. Note that we may choose the same j any number of times.

Sample Input 3

Copy
10 8
5 3 6 8 7 10 9 1 2 4
3 1
4 1
5 9
2 5
6 5
3 5
8 9
7 9


Sample Output 3

Copy
8


Sample Input 4

Copy
5 1
1 2 3 4 5
1 5


Sample Output 4

Copy
5


We do not have to perform the operation.

/**

*/

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=2e5+7;
int a[maxn];
bool vis[maxn];

vector<int>v[maxn];
set<int>s;

void dfs(int pos){
vis[pos]=1;
s.insert(pos);
for(int k:v[pos]) if(!vis[k]) dfs(k);
}

int main (){
ios_base::sync_with_stdio(false);
int n,m;cin>>n>>m;
memset(vis,0,(n+3)*sizeof(bool));
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++){
int x,y;cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
int ans=0;
for(int i=1;i<=n;i++){
if(!vis[i]) dfs(i);
for(int k:s) if(s.find(a[k])!=s.end()) ans++;
s.clear();
}
cout<<ans<<endl;
return 0;
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120