`
从此醉
  • 浏览: 1044645 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

uva 1329 Corporative Network

 
阅读更多

点击打开链接uva 1329

思路: 带权并查集
分析:
1 看懂题目就是切菜了

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 20010;

int n;
int father[MAXN];
int rank[MAXN];

void init(){
    memset(rank , 0 , sizeof(rank));
    for(int i = 1 ; i < MAXN ; i++)
        father[i] = i;
}

int find(int x){
    if(father[x] == x)
        return x;
    int tmp = father[x];
    father[x] = find(father[x]);
    rank[x] += rank[tmp];
    return father[x];
}

int main(){
    int Case;
    char c;
    int x , y;
    scanf("%d" , &Case);
    while(Case--){
         init();
         scanf("%d%*c" , &n); 
         while(scanf("%c" , &c) && c != 'O'){
              if(c == 'E'){
                  scanf("%d%*c" , &x);
                  int tmp = find(x);
                  printf("%d\n" , rank[x]);
              }
              else{
                  scanf("%d%d%*c" , &x , &y); 
                  int fx = find(x); 
                  int fy = find(y); 
                  if(fx != fy){
                     father[fx] = fy;
                     rank[fx] = abs(x-y)%1000+rank[y]-rank[x];
                  }
              } 
         }
    }
    return 0;
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics