0
点赞
收藏
分享

微信扫一扫

瓜瓜上电工

犹大之窗 2022-03-20 阅读 20
算法

题目链接:瓜瓜上电工在这里插入图片描述

#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;
}
举报

相关推荐

0 条评论