1067. Sort with Swap(0,*) (25)

来源:互联网 发布:淘宝客链接批量转换 编辑:程序博客网 时间:2024/04/28 02:53
#include <iostream>#include <cstdio>using namespace std;#define N 100000inline int root(int n, int rid[]) {while(n != rid[n]) n = rid[n];return n;}inline void connect(int a, int b, int rid[], int count[]) {int ra = root(a, rid);int rb = root(b, rid);if(ra == a && !count[ra])count[ra] ++;if(rb == b && !count[rb])count[rb] ++;if(ra != rb) {int ca = count[ra];int cb = count[rb];if(ca > cb) {rid[rb] = ra;count[ra] += count[rb];}else {rid[ra] = rb;count[rb] += count[ra];}}}int main(int argc, char **argv) {int n;cin >> n;int rid[N] = {}, count[N] = {};for(int i = 0; i < n; i ++) {rid[i] = i;}int index;for(int i = 0; i < n; i ++) {int d;scanf("%d", &d);connect(d, i, rid, count);}int sn = 0;for(int i = 0; i < n; i ++) {if(i == rid[i] && count[i] > 1) {sn = sn + 1 + count[i];}}if(n > 1 && (rid[0] || count[0] > 1))sn -= 2;cout << sn << endl;return 0;} 

0 0
原创粉丝点击