标签:and HERE strong output time pos printf single starting
题目链接:
http://poj.org/problem?id=2524
| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 39369 | Accepted: 18782 | 
Description
Input
Output
Sample Input
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
Sample Output
Case 1: 1 Case 2: 7
Hint
#include<stdio.h>
#include<iostream>
using namespace std;
#define max_v 50005
int pa[max_v];//pa[x] 表示x的父节点
int rk[max_v];//rk[x] 表示以x为根结点的树的高度
int n,ans;
void make_set(int x)
{
    pa[x]=x;
    rk[x]=0;//一开始每个节点的父节点都是自己
}
int find_set(int x)//带路径压缩的查找
{
    if(x!=pa[x])
        pa[x]=find_set(pa[x]);
    return pa[x];
}
void union_set(int x,int y)
{
    x=find_set(x);//找到x的根结点
    y=find_set(y);
    if(x==y)//根结点相同 同一棵树
        return ;
    ans--;
    if(rk[x]>rk[y])
    {
        pa[y]=x;
    }else
    {
        pa[x]=y;
        if(rk[x]==rk[y])
            rk[y]++;
    }
}
int main()
{
    int n,m,j=0;
    while(~scanf("%d %d",&n,&m))
    {
        if(m+n==0)
            break;
        for(int i=1;i<=n;i++)
        {
            make_set(i);
        }
        ans=n;
        for(int i=0;i<m;i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            union_set(x,y);
        }
        printf("Case %d: %d\n",++j,ans);
    }
    return 0;
}
标签:and HERE strong output time pos printf single starting
原文地址:https://www.cnblogs.com/yinbiao/p/9168909.html