某场CF Div2 Peaceful Rooks

题目链接:Peaceful Rooks

 

题目大意:

有一个n*n的棋盘,上面有m个棋子,并且初始位置各个棋子不会互相攻击到(类似于8皇后),问最少移动多少步。

 

思路:

首先,这个题转化为建图:

为什么建图:

 

 

建图可以用dsu(并查集),判环

 

 

参考代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define N 200010
 4 int f[N];
 5 int get(int x) {
 6     return f[x] == x?f[x]:(f[x] = get(f[x]));
 7 }
 8 int main() {
 9     int t,m,n;
10     cin >> t;
11     while(t--) {
12         int ans = 0;
13         cin >> n>> m;
14         for(int i = 1; i <= n; i++) f[i] = i;
15         for(int i = 0; i < m; i++) {
16             int x,y;
17             cin >> x >> y;
18             if(x == y) continue;
19             x = get(x); y = get(y);
20             if(x != y) {
21                 ans++;
22                 f[y] = x;
23             } else ans += 2;
24         }
25         cout << ans << endl;
26     }
27     return 0;
28 }
View Code

 

posted @ 2020-12-21 16:30  不敢说的梦  阅读(287)  评论(0)    收藏  举报