• 并查集 找k颗树使节点数最多


    #include<algorithm>
    #include <iostream>
    #include <cstdio>
    #include <string.h>
    
    using namespace std;
    
    int f[10002],num[10002];
    int find(int x)
    {
        return f[x]==x?x:f[x]=find(f[x]);
    }
    
    int main()
    {
        int i,j,n,m,t,k,a,len,b;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d",&n,&m,&k);
            for(i=0;i<n;i++)
            {
                f[i]=i;
                num[i]=1;
            }
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                int aa=find(a);
                int bb=find(b);
                if(aa!=bb)
                {
                    f[aa]=bb;
                    num[bb]+=num[aa];
                    num[aa]=0;
                }
            }
            for(i=0;i<n;i++)
                find(i);
            //for(i=0;i<n;i++)
            //    printf("__%d  ",num[i]);
            int ans=0,numi,final=0;
    
           sort(num,num+n);
           for(i=1;i<=k;i++)
               final+=num[n-i];
                   printf("%d
    ",final);
                
           
        }
        return 0;
    }
    
    
           

    小希的迷宫 :点是不连续的 注意每次要把f[i]=i 初始化 到 100002 

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    
    using namespace std;
    
    struct node{int x;int y;} no[100002];
    
    int f[200002],vis[200002];
    
    int find(int x)
    {
       return f[x]==x?x:f[x]=find(f[x]); 
    }
    
    int main()
    {
        int i,a,b,aa,bb,maxx=0,num=0;
        memset(vis,0,sizeof(vis));
        while(~scanf("%d %d",&a,&b))
        {
        
            if(a==-1&&b==-1)
                break;
            else if(a==0&&b==0)
            {
                if(num==0)
                {
                    printf("Yes
    ");
                    continue;
                }
                memset(f,0,sizeof(f));
                int flag=0;
                for(i=0;i<=100002;i++)
                    f[i]=i;
                for(i=0;i<num;i++)
                {
                    aa=find(no[i].x);
                    bb=find(no[i].y);
                    if(aa==bb)
                    {
                        flag=1;
                        break;
                    }
                    else 
                        f[aa]=bb;
                }
                int cnt=0;
                for(i=0;i<=maxx;i++)
                    if(vis[i]&&find(i)==i)
                        cnt++;
    
    
                if(!flag&&cnt==1)
                    printf("Yes
    ");
                else 
                    printf("No
    ");
                    
                maxx=0;
                num=0;
                memset(vis,0,sizeof(vis));
            }
            else
            {
                vis[a]=vis[b]=1;
                no[num].x=a;
                no[num++].y=b;
                if(maxx<a)
                    maxx=a;
                if(maxx<b)
                    maxx=b;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    从DataGridViewer导出Excel
    C#获取特定进程CPU和内存使用率
    51 nod 1265 四点共面
    51nod 1384 全排列
    51nod 2006 飞行员配对
    codeforces 839A
    codeforce 837C
    codeforces 837B
    codoforces 837A
    GIT
  • 原文地址:https://www.cnblogs.com/assult/p/3355621.html
Copyright © 2020-2023  润新知