关于使用vector存边,sort排序
查看原帖
关于使用vector存边,sort排序
243063
cyx20080216楼主2021/8/25 22:46
#include<bits/stdc++.h>
using namespace std;
struct line
{
	int from,to,w;
	line(const int &from,const int &to,const int &w):
		from(from),
		to(to),
		w(w)
	{
	}
};
int n;
vector<line> lines;
int f[301];
inline void init()
{
	for(int i=0;i<=300;i++)
		f[i]=i;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int w;
		scanf("%d",&w);
		lines.push_back(line(0,i,w));
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			int w;
			scanf("%d",&w);
			lines.push_back(line(i,j,w));
		}
}
int findFather(const int &a)
{
	if(f[a]==a)
		return a;
	else
	{
		f[a]=findFather(f[a]);
		return f[a];
	}
}
inline void merge(const int &a,const int &b)
{
	f[findFather(b)]=findFather(a);
}
inline bool cmp(const line &a,const line &b)
{
	return a.w<=b.w;
}
inline int kruskal()
{
	sort(lines.begin(),lines.end(),cmp);
	int sum=0;
	for(vector<line>::const_iterator i=lines.begin();i!=lines.end();i++)
		if(findFather(i->from)!=findFather(i->to))
		{
			merge(i->from,i->to);
			sum+=i->w;
		}
	return sum;
}
int main()
{
	init();
	printf("%d\n",kruskal());
	return 0;
}

以上代码,提交后会迷之RE*9,调试后发现在cmp函数内RE,将sort替换为stable_sort可避免该问题

2021/8/25 22:46
加载中...