Kruskal模板

2017/11/05 OI 图论

Kruskal模板

  既然是模板,就没什么好说的。

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;
struct kruskal
{
	vector<vector<pair<int,int> > > ans;
	vector<pair< pair<int,int>,int> > edge;
	vector<int> flag;
	int size;
	kruskal(int n,int m)
	{
		size=n;
		flag.resize(n,-1);
		edge.resize(m);
		ans.resize(n,vector<pair<int,int> >());
	}
	kruskal(){}
	void resize(int n,int m)
	{
		ans.clear();
		edge.clear();
		flag.clear();
		size=n;
		flag.resize(n,-1);
		edge.resize(m);		
		ans.resize(n,vector<pair<int,int> >());
	}
	int get_father(int index)
	{
		if(flag[flag[index]]==flag[index])
			return flag[index];
		else
			flag[index]=flag[flag[index]];
		return flag[index];
	}
	void read()
	{
		int n,m;
		cin>>n>>m;
		resize(n,m);
		int s,e,k;
		for(int i=0;i<m;i++)
		{
			cin>>s>>e>>k;
			s-=1;
			e-=1;
			edge[i].first.first=s;
			edge[i].first.second=e;
			edge[i].second=k;
		}
		sort(edge.begin(),edge.end(),[&](const pair< pair<int,int>,int>& p1,const pair< pair<int,int>,int>& p2)
		->bool{return p1.second<p2.second;});
		for(int i=0;i<n;i++)
			flag[i]=i;
		for(int i=0;i<m;i++)
		{
			if(get_father(edge[i].first.first)!=get_father(edge[i].first.second))
			{
				pair<int,int> p;
				p.first=edge[i].first.second;
				p.second=edge[i].second;
				ans[edge[i].first.first].push_back(p);
				flag[edge[i].first.first]=get_father(edge[i].first.second);
			}
		}
	}

};
int main()
{
	kruskal k;
	k.read();
	for(int i=0;i<k.ans.size();i++)
	{
		cout<<"index: "<<i<<endl;
		for(int j=0;j<k.ans[i].size();j++)
		{
			cout<<"\t"<<k.ans[i][j].first<<" "<<k.ans[i][j].second<<endl;
		}
	}
	return 0;
}
Show Disqus Comments

Search

    welcome to visit my github

    creatorlxd's github

    Table of Contents