次小生成树
int fa[N];
int head[N],end[N];
int next[N];
int len[N][N];
struct Node
{
int x,y,c;
bool flag;
} f[M];
int find(int x)
{
if(x==fa[x]) return x;
else return fa[x]=find(fa[x]);
}
bool cmp(struct Node a,struct Node b)
{
return a.c<b.c;
}
void merge(int x,int y,int c)
{
for(int u=head[x]; u!=-1; u=next[u])
for(int v=head[y]; v!=-1; v=next[v])
len[u][v]=len[v][u]=c;
next[end[x]]=y;
end[x]=end[y];
fa[y]=x;
}
int solve(int n,int m)
{
memset(next,-1,sizeof(next));
//输入时记得初始化f的flag
for(int i=1; i<=n; i++) head[i]=end[i]=fa[i]=i;
int sum=0; //最小生成树权值
int ans=1e9; //次小生成树权值
sort(f,f+m,cmp);
for(int i=0; i<m; i++)
{
int x=find(f[i].x);
int y=find(f[i].y);
if(x!=y)
{
merge(x,y,f[i].c);
f[i].flag=1;
sum+=f[i].c;
}
}
for(int i=0; i<m; i++)
{
if(!f[i].flag) ans=min(ans,sum+f[i].c-len[ f[i].x ][ f[i].y ]);
}
return ans;
}
次小生成树
最新推荐文章于 2023-11-29 11:19:22 发布