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;
}