最小生成树
首先要知道一个具有N个节点的无向连通图最少需要N-1条边
题意如下
给N个点 M条无向边 求出最小生成树(边权值之和最小)
输入格式:
第一行包含两个整数N、M,表示该图共有N个结点和M条无向边。(N<=5000,M<=200000)
接下来M行每行包含三个整数Xi、Yi、Zi,表示有一条长度为Zi的无向边连接结点Xi、Yi
输出格式:
输出包含一个数,即最小生成树的各边的长度之和;如果该图不连通则输出orz
操作很简单 先用结构体把 起点 终点 边权 记录下来 再按边权自小
到大排一遍 利用并查集扫一遍就可以
#include<iostream>
#include<algorithm>
using namespace std;
struct AC
{
int s,t,w;
}edge[200100];
int fa[200100];
bool cmp(AC x,AC y)
{
return x.w<y.w;
}
int find(int x)
{
if(x==fa[x])
{
return x;
}
return fa[x]=find(fa[x]);
}
int main()
{
int n,m,sum=0;
cin>>n>>m;
for(int i=0;i<=n;i++)
{
fa[i]=i;
}
for(int i=0;i<m;i++)
{
cin>>edge[i].s>>edge[i].t>>edge[i].w;
}
sort(edge,edge+m,cmp);
int k=0;
for(int i=0;i<m;i++)
{
if(find(edge[i].s)!=find(edge[i].t))
{
k++;
sum+=edge[i].w;
fa[find(edge[i].s)]=fa[edge[i].t];
}
}
if(k==n-1)
{
cout<<sum;
}
else
{
cout<<"orz";
}
}
至于 最大生成树 一样的配方