P1682 过家家

by luogu

开了一个并查集的题

题意有些混乱

脑子抽了写的注释有些#!@¥%…………¥

 

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int n,m,k,g;
 6 int f[333];
 7 
 8 void init()
 9 {//并查集 
10     for(int i=1;i<=n;i++)
11     f[i]=i;return ;
12 }
13 
14 int find (int k)
15 {//
16     if(k==f[k])
17     return k;
18     return f[k]=find(f[k]);
19 }
20 
21 void link(int q,int w)
22 {//
23     int f1=find(q),f2=find(w);
24     if(f1!=f2)
25     f[q]=f2;
26     return ;
27 }
28 bool v[333][333];
29 
30 void uuu(int x)
31 {//她可以和他’van‘,她朋友也可以’加入♂‘ 
32     for(int i=1;i<=n;i++)
33     {
34         if(v[x][i])
35         v[find(x)][i]=1;
36     }
37     return ;
38 }
39 
40 int num(int x)
41 {//康康她可以和几个人’van‘
42     int re=0;
43     for(int i=1;i<=n;i++)
44     {
45         if(v[x][i])
46         re++;
47     }
48     return re;
49 }
50 int ans=10011010;
51 //k个男生接受 
52 int main()
53 {
54     ios::sync_with_stdio(false);
55     cin>>n>>m>>k>>g;
56     init();
57     for(int i=1;i<=m;i++)
58     {
59         int q,w;
60         cin>>q>>w;
61     //    link(q,w);
62         v[q][w]=1;
63     }//q可以和w ‘van’ 
64     for(int i=1;i<=g;i++)
65     {
66         int q,w;
67         cin>>q>>w;
68         link(q,w);
69     }//她们之间是 ’朋友 ‘ 
70     for(int i=1;i<=n;i++)
71     uuu(i); 
72     
73     for(int i=1;i<=n;i++)
74     {
75         if(f[i]==i)//一个联通块
76         //用来查每个联通的一群人人数的最小值 
77             ans=min(num(i),ans);    
78         //康康她可以和几个人’van‘
79     }
80     cout<<min(ans+k,n);//可以强制 
81     
82     
83     
84     return 0;
85 }

 

posted @ 2021-06-25 15:59  Hehe_0  阅读(110)  评论(0)    收藏  举报