嗯。。都是些最最最基础的水题 直接模板就OK了。。 刚学的可以一做
1.洛谷 并查集模板
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 10005
#define M 200005
using namespace std;
int n,m,p;
int fa[M];
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
void solve(){
scanf("%d%d",&n,&m);
int k,x,y;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&k,&x,&y);
if(k==1)
merge(x,y);
else {
if(findf(x)==findf(y))
printf("Y\n");
else printf("N\n");
}
}
}
int main(){
solve();
return 0;
}
2.vijos1034家族
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 5005
#define M 5005
using namespace std;
int n,m,p;
int fa[M];
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
if(findf(x)!=findf(y))
fa[findf(x)]=findf(y);
}
void solve(){
scanf("%d%d%d",&n,&m,&p);
int x,y;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
merge(x,y);
}
for(int i=1;i<=p;i++){
scanf("%d%d",&x,&y);
if(findf(x)==findf(y)) printf("Yes\n");
else printf("No\n");
}
}
int main(){
solve();
return 0;
}
3.洛谷p1892团伙
#include<cstdio>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m;
int flag;
int f[2500];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n*2;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
char t;int x,y;
cin>>t>>x>>y;
if(t=='F') f[find(x)]=find(y);
if(t=='E')
{
f[find(x+n)]=find(y);
f[find(y+n)]=find(x);
}
}
int s=0;
for(int i=1;i<=n;i++)
if(f[i]==i) s++;
printf("%d",s);
return 0;
}
4.洛谷p2078朋友
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 20005
#define M 20005
using namespace std;
int n,m,p,q;
int a[N],b[N];
int findf1(int x) {
return a[x]==x?x:a[x]=findf1(a[x]);
}
int findf2(int x) {
return b[x]==x?x:b[x]=findf2(b[x]);
}
void merge1(int x,int y) {
if(findf1(x)<findf1(y)) swap(x,y);
a[findf1(x)]=findf1(y);
}
void merge2(int x,int y) {
if(findf2(x)<findf2(y)) swap(x,y);
b[findf2(x)]=findf2(y);
}
int main() {
scanf("%d%d%d%d",&n,&m,&p,&q);
int x,y;
for(int i=1; i<=n; i++) a[i]=i;
for(int i=1; i<=m; i++) b[i]=i;
for(int i=1; i<=p; i++) {
scanf("%d%d",&x,&y);
merge1(x,y);
}
for(int i=1; i<=q; i++) {
scanf("%d%d",&x,&y);
merge2(-x,-y);
}
int cnta=0,cntb=0;
for(int i=1; i<=n; i++) {
if(findf1(1)==findf1(i)) cnta++;
}
for(int i=1; i<=m; i++) {
if(findf2(1)==findf2(i)) cntb++;
}
printf("%d",min(cnta,cntb));
return 0;
}
5.洛谷p1547Out Of Hay
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define N 2005
#define M 10005
using namespace std;
int n,m;
int fa[N];
struct node{
int l,r,w;
}e[M];
bool cmp(node x,node y){
return x.w<y.w;
}
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].w);
sort(e+1,e+1+m,cmp);
int ans=0,tot=0;
for(int i=1;i<=m;i++){
int x=e[i].l;int y=e[i].r;
if(findf(x)!=findf(y))
{
merge(x,y);
ans=e[i].w;
tot++;
}
if(tot==n-1) break;
}
printf("%d",ans);
return 0;
}
6.洛谷p1536村村通
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1005
#define M 10005
using namespace std;
int n,m;
int fa[N];
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
int main(){
int tot=0;
while(1){
bool flag=0;
tot=0;
scanf("%d",&n);
if(n==0) break;
scanf("%d",&m);
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++)
fa[i]=i;
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(findf(x)!=findf(y)&&flag==0)
{
merge(x,y);
tot++;
}
if(tot==n-1)
flag=1;
}
printf("%d\n",n-1-tot);
}
return 0;
}
7.洛谷p1396 营救(最小生成树+并查集)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#define N 10005
#define M 20005
using namespace std;
int n,m,s,t;
int fa[N];
struct node{
int l,r,w;
}e[M];
void read(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].w);
}
bool cmp(node xx,node yy){
return xx.w<yy.w;
}
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
int main(){
int ans=0,cnt=0;
read();
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
int x=e[i].l;
int y=e[i].r;
int w=e[i].w;
if(findf(x)!=findf(y)) {
cnt++;
merge(x,y);
ans=w;
}
if(findf(s)==findf(t)) break;
if(cnt==n-1) break;
}
printf("%d",ans);
return 0;
}
8.洛谷p1195口袋的天空
/*
P1195 口袋的天空
n个点 m条边 连成k个树的最小代价
若k为1 则连成一棵MST 跑一次kruskal n-1次连边
若 k为2 为最后的图必须为 两颗MST n-2次连边
同理 连成k个mst 进行 n-k次连边
若进行者n-k次操作中 没有了边 (即cpp中的 i<m) 直接输出 No Answer
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1005
#define M 10005
using namespace std;
int n,m,k;
int fa[N];
struct node{
int l,r,w;
}e[M];
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
void read(){
scanf("%d%d%d",&n,&m,&k);
int x,y,t;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].w);
}
bool cmp(node xx,node yy){
return xx.w<yy.w;
}
int main(){
read();
for(int i=1;i<=n;i++)
fa[i]=i;
sort(e+1,e+1+m,cmp);
int tot=0,ans=0;
for(int i=1;i<=m;i++){
int x=e[i].l;
int y=e[i].r;
int w=e[i].w;
if(findf(x)!=findf(y)){
merge(x,y);
tot++;
ans+=w;
}
if(tot==n-k){
printf("%d",ans);
return 0;
}
}
printf("No Answer");
return 0;
}
9.洛谷P1111修复公路
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1005
#define M 100005
using namespace std;
int n,m;
int fa[N];
struct node{
int l,r,t;
}e[M];
int findf(int x){
return fa[x]==x?x:fa[x]=findf(fa[x]);
}
void merge(int x,int y){
fa[findf(x)]=findf(y);
}
void read(){
scanf("%d%d",&n,&m);
int x,y,t;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].l,&e[i].r,&e[i].t);
}
bool cmp(node xx,node yy){
return xx.t<yy.t;
}
int main(){
read();
sort(e+1,e+1+m,cmp);
int tot=0;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
int x=e[i].l;
int y=e[i].r;
int t=e[i].t;
if(findf(x)!=findf(y)){
merge(x,y);
tot++;
}
if(tot==n-1){
printf("%d",t);
return 0;
}
}
printf("-1");
return 0;
}