题目链接:瓜瓜上电工
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int l[maxn],r[maxn],s[maxn];
int main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=q;i++)
cin>>l[i]>>r[i];
for(int i=1;i<=10;i++)
s[i]=i;
int mi=0x3f3f3f;
do
{
int a=0,b=0,sum=0;
for(int i=1;i<=q;i++)
{
int t =s[i];
//cout<<t<<endl;
sum+=min((a!=l[t])+(b!=r[t]),(a!=r[t])+(b!=l[t]));
a=l[t],b=r[t];
}
mi=min(mi,sum);
}while(next_permutation(s+1,s+1+q));
cout<<mi+2<<endl;
}
并查集
#include<bits/stdc++.h>
using namespace std;
int f[105],in[105];
int getf(int u)
{
if(f[u]==u)
return u;
else
{
f[u]=getf(f[u]);
return f[u];
}
}
int merge(int u,int v)
{
int t1=getf(u);
int t2=getf(v);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
return 0;
}
int main()
{
int n;
int q;
cin>>n>>q;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
in[x]=1;
in[y]=1;
merge(x,y);
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(in[i]&&f[i]==i)
sum++;
}
cout<<sum+q+2<<endl;
}