kruskal (图的最小生成树)

  使用并查集的算法思想!

#include "iostream"
#include "algorithm"
using namespace std;
struct edge
{
	int u;
	int v;
	int w;
};
edge e[100];
int n,m;
int f[100];
int getf(int v)
{
	if(f[v]==v)
	{
		return v;
	}
	else
	{
		f[v]=getf(f[v]);
		return f[v];
	}
}
bool merge(int u,int v)
{
	int t1=getf(u);
	int t2=getf(v);
	if(t1!=t2)
	{
		f[t2]=t1;
		return 1;
	}
	return 0;
}
bool cmp(edge a,edge b)
{
	return a.w<=b.w;
}
int main()
{
	//freopen("c:\\users\\刘志远\\desktop\\data.txt","r",stdin);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	for(int i=1;i<=n;i++)
	f[i]=i;
	int sum=0;
	int count=0;
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		if(merge(e[i].u,e[i].v))//没有同一个祖先 
		{
			count++; 
			sum+=e[i].w;	
		}
		if(count==n-1)//不加也可以 
		break;
	}
	cout<<sum<<endl;
	return 0;
 } 

 二分图最大匹配!!!

#include "iostream"
//大部分过了,特殊案例没通过 
using namespace std;
int march[506];
int e[506][506];
int book[506];
int n,m,k;
int dfs(int u)
{
	for(int i=1;i<=m;i++)
	{
		if(book[i]==0&&e[u][i])
		{
			book[i]=1;
			if(march[i]==0||dfs(march[i]))
			{
				march[i]=u;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	freopen("c:\\users\\刘志远\\desktop\\data.txt","r",stdin);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	{
		int num;
		cin>>num;
		for(int j=1;j<=num;j++)
		{
			int cur;
			cin>>cur;
			e[i][cur]=1;
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=505;j++) book[j]=0;
		if(dfs(i)) sum++;
	}
	for(int i=1;i<=m;i++)
	{
		if(march[i]==0)
		{
			for(int j=1;j<=n;j++)
			{
				if(e[j][i]&&k)
				{
					march[i]=j;
					sum++;
					k--;
				}
			}
		}
	}
	cout<<sum<<endl;
	return 0;
	/*
	int i,j,t1,t2,sum=0;
	cin>>n>>m;
	for(i=1;i<=m;i++)
	{
		cin>>t1>>t2;
		e[t1][t2]=1;	
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++) book[j]=0;
		if(dfs(i)) sum++;
	}
	cout<<sum<<endl;
	*/
 } 

猜你喜欢

转载自blog.csdn.net/weixin_41466575/article/details/84350581