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 }